在Oracle中,"未完全指定的日期常量是什么。" 是什么意思?任何例子?根据文档,无法在检查约束和列默认值中指定它。
答案 0 :(得分:0)
这是来自the documentation on 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
。
答案 1 :(得分:0)
从这里得到答案https://forums.oracle.com/forums/message.jspa?messageID=10494087#10494087
未完全指定表示可能导致不明确或不同值的日期格式,
例如,当它依赖于其他变量时,例如依赖于sysdate的世纪数据的RR格式,
所以'02 -jan-12'可能是'02 -jan-1912'如果sysdate中的那一年是1900年 如果sysdates年是2000年,可能是2012年
答案 2 :(得分:0)
我认为文档错了。您可以在约束或默认值中使用未完全指定的日期常量。在某些情况下,甚至“完全指定”的日期常量仍可能失败。我不确定文档的确切含义,但我认为这里的真正问题是假定日期格式的经典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-JAN-2000出了什么问题?不是每个人都知道“JAN”是什么。
SQL> select to_char(date '2000-01-01', 'MON') from dual;
TO_CH
-----
JANV.
这个故事的真正道德
如果您想使用日期文字,请始终使用ANSI date literal:DATE '2000-01-01'