'04/04/2012 13:35 PM'
er ikke en dato - det er en streng.
Oracle vil lave en implicit TO_DATE( string_value, format_mask )
på ikke-dato-literaler, når du indsætter dem i en DATE
kolonne ved hjælp af værdien af NLS_DATE_FORMAT
sessionsparameter som formatmasken (bemærk:dette er en sessionsparameter og tilhører klienten; det er ikke en global indstilling ). Hvis den ikke-dato-literal matcher dette format, vil den fungere (og hvis den ikke gør det, vil den ikke) - dog hvis NLS_DATE_FORMAT
nogensinde ændres, vil den øjeblikkeligt gå i stykker (det vil være en stor smerte at fejlfinde, da koden, der virkede, ikke vil, men ingen vil have ændret koden).
Du kan finde ud af din nuværende NLS_DATE_FORMAT
med forespørgslen:
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Det er bedre eksplicit at bruge TO_DATE()
med det korrekte formatmaske eller at bruge en ANSI/ISO-dato-literal (dvs. DATE '2012-04-04'
eller TIMESTAMP '2012-04-04 13:35'
).
Du kan gøre:
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );
(du behøver ikke AM/PM
da timekomponenten allerede er på et 24 timers ur)
eller
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(ved hjælp af ANSI/ISO tidsstemplet literal, som Oracle implicit vil konvertere til en dato)