Константы даты, которые не указаны полностью
В Oracle, что означает "константы даты, которые не указаны полностью". имею в виду? Есть примеры? Он не может быть указан в Проверке ограничений и значений столбца по умолчанию в соответствии с документацией.
3 ответа
Я думаю, что документация неверна. Вы можете использовать константу даты, которая не указана полностью, в ограничении или по умолчанию. И даже "полностью указанная" константа даты в некоторых случаях все еще может потерпеть неудачу. Я не уверен точно, что означает документация, но я думаю, что реальная проблема здесь - это классическая проблема Oracle в предположении формата даты.
DEFAULT
Предложение не хранит значение, оно хранит выражение, которое будет оцениваться со значением при каждом его использовании.
Если вы делаете что-то глупое, как:
alter session set nls_date_format = 'DD';
create table date_test(a number, b date default '01');
Это будет работать некоторое время:
insert into date_test(a) values (1);
select b from date_test;
B
--
01
Но если кто-то использует другой формат даты, он потерпит крах только для них:
alter session set nls_date_format = 'DD-MON-YYYY';
insert into date_test(a) values (1);
*
ERROR at line 1:
ORA-01840: input value not long enough for date format
Обратите внимание, что полностью определенное, однозначное выражение все еще может вызывать проблемы.
alter session set nls_date_format = 'DD-MON-YYYY';
create table date_test2(a number, b date default to_date('01-JAN-2000', 'DD-MON-YYYY'));
alter session set nls_language = 'FRENCH';
insert into date_test(a) values(1);
*
ERROR at line 1:
ORA-01840: valeur entrΘe pas assez longue pour le format de la date
Что не так с 01 января 2000 года? Не все знают, что такое "ЯН".
SQL> select to_char(date '2000-01-01', 'MON') from dual;
TO_CH
-----
JANV.
Настоящая мораль этой истории
Если вы хотите использовать литерал даты, всегда используйте литерал даты ANSI: DATE '2000-01-01'
Это строка из документации по CREATE TABLE. Я думаю, что это означает, что дата по умолчанию должна быть правильно отформатирована.
Итак, предположим, что мы хотим правило, которое по умолчанию даты первого дня текущего года. Это действительно:
create table t1 (d1 date default to_date('01-JAN', 'DD-MON'));
тогда как это утверждение...
create table t1 (d1 date default to_date('01-JAN'));
... швыряетORA-01840: input value not long enough for date format
,
Получил ответ отсюда https://forums.oracle.com/forums/message.jspa?messageID=10494087
не указано полностью означает форматы даты, которые могут привести к неоднозначным или другим значениям,
например, когда это зависит от других переменных, таких как формат RR, который зависит от sysdate для данных столетия,
таким образом, '02-jan-12'может быть '02-jan-1912', если год в sysdate равен 1900, и может быть 2012, если год sysdates равен 2000