'04/04/2012 13:35 PM'
är inte ett datum - det är en sträng.
Oracle kommer att göra en implicit TO_DATE( string_value, format_mask )
på bokstaver som inte är datum när du infogar dem i en DATE
kolumnen med värdet för NLS_DATE_FORMAT
sessionsparameter som formatmasken (observera:detta är en sessionsparameter och tillhör klienten; det är inte en global inställning ). Om den icke-datumliteralen matchar detta format kommer den att fungera (och om den inte gör det kommer den inte att fungera) - dock om NLS_DATE_FORMAT
någonsin ändras så kommer den omedelbart att gå sönder (det är svårt att felsöka eftersom koden som fungerade inte kommer att fungera men ingen kommer att ha ändrat koden).
Du kan ta reda på din nuvarande NLS_DATE_FORMAT
med frågan:
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Det är bättre att uttryckligen använda TO_DATE()
med rätt formatmask eller att använda en ANSI/ISO-datumliteral (dvs. DATE '2012-04-04'
eller TIMESTAMP '2012-04-04 13:35'
).
Du kan göra:
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );
(du behöver inte AM/PM
eftersom timkomponenten redan är på en 24-timmarsklocka)
eller
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(med hjälp av ANSI/ISO-tidsstämpeln som Oracle implicit konverterar till ett datum)