未完全指定的日期常量

时间:2012-08-02 05:22:47

标签: database oracle default-value check-constraints

在Oracle中,"未完全指定的日期常量是什么。" 是什么意思?任何例子?根据文档,无法在检查约束和列默认值中指定它。

3 个答案:

答案 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 literalDATE '2000-01-01'