'04/04/2012 13:35 PM'
to nie data - to ciąg znaków.
Oracle wykona niejawne TO_DATE( string_value, format_mask )
na literałach niebędących datami podczas wstawiania ich do DATE
kolumna przy użyciu wartości NLS_DATE_FORMAT
parametr sesji jako maska formatu (uwaga:jest to parametr sesji i należy do klienta; nie jest to ustawienie globalne ). Jeśli literał niedatowany pasuje do tego formatu, będzie działał (a jeśli nie, to nie będzie) - jednak, jeśli NLS_DATE_FORMAT
jest kiedykolwiek zmieniany, to natychmiast się zepsuje (każdy może być ogromnym problemem podczas debugowania, ponieważ kod, który działał, nie ulegnie zmianie, ale nikt go nie zmieni).
Możesz sprawdzić swój aktualny NLS_DATE_FORMAT
z zapytaniem:
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Lepiej jest jawnie użyć TO_DATE()
z poprawną maską formatu lub użyć literału daty ANSI/ISO (np. DATE '2012-04-04'
lub TIMESTAMP '2012-04-04 13:35'
).
Możesz zrobić:
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );
(nie potrzebujesz AM/PM
ponieważ składnik godzinowy jest już ustawiony na zegar 24-godzinny)
lub
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(przy użyciu literału znacznika czasu ANSI/ISO, który Oracle niejawnie przekonwertuje na datę)