'04/04/2012 13:35 PM'
не е дата - това е низ.
Oracle ще направи имплицитно TO_DATE( string_value, format_mask )
върху литерали без дата, когато ги вмъквате в DATE
колона, използвайки стойността на NLS_DATE_FORMAT
сесиен параметър като маска на формат (забележка:това е сесиен параметър и принадлежи на клиента; не е глобална настройка ). Ако литералът без дата съвпада с този формат, тогава той ще работи (а ако не, тогава няма) - обаче, ако NLS_DATE_FORMAT
ако някога се промени, той незабавно ще се повреди (отстраняването на грешки ще бъде огромна болка, тъй като кодът, който е работил, няма да го направи, но никой няма да е променил кода).
Можете да разберете текущия си NLS_DATE_FORMAT
със заявката:
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
По-добре е изрично да използвате TO_DATE()
с правилната маска за формат или да използвате ANSI/ISO литерал за дата (т.е. DATE '2012-04-04'
или TIMESTAMP '2012-04-04 13:35'
).
Можете да направите:
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );
(нямате нужда от AM/PM
тъй като часовият компонент вече е на 24-часов часовник)
или
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(използвайки литерала за клеймо за време ANSI/ISO, който Oracle ще преобразува имплицитно в дата)