在 Oracle 中, “未完全指定的日期常量”是什么意思。意思是?有什么例子吗?根据文档,它不能在检查约束和列默认值中指定。
3 回答
这是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#10494087
未完全指定是指可能导致不明确或不同值的日期格式,
例如,当它依赖于其他变量时,例如依赖 sysdate 的世纪数据的 RR 格式,
因此,如果 sysdate 中的年份是 1900,则“02-jan-12”可能是“02-jan-1912”,如果 sysdates 年份是 2000,则可能是 2012
我认为文档是错误的。您可以在约束或默认值中使用未完全指定的日期常量。在某些情况下,即使是“完全指定”的日期常量也可能会失败。我不确定文档的确切含义,但我认为这里的真正问题是假设日期格式的经典 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
2000 年 1 月 1 日有什么问题?不是每个人都知道“JAN”是什么。
SQL> select to_char(date '2000-01-01', 'MON') from dual;
TO_CH
-----
JANV.
这个故事的真正寓意
如果要使用日期文字,请始终使用ANSI 日期文字:DATE '2000-01-01'