2

在 Oracle 中, “未完全指定的日期常量”是什么意思。意思是?有什么例子吗?根据文档,它不能在检查约束和列默认值中指定。

4

3 回答 3

0

这是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

于 2012-08-02T08:00:13.263 回答
0

从这里得到答案https://forums.oracle.com/forums/message.jspa?messageID=10494087#10494087

未完全指定是指可能导致不明确或不同值的日期格式,

例如,当它依赖于其他变量时,例如依赖 sysdate 的世纪数据的 RR 格式,

因此,如果 sysdate 中的年份是 1900,则“02-jan-12”可能是“02-jan-1912”,如果 sysdates 年份是 2000,则可能是 2012

于 2012-08-04T14:08:19.133 回答
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

2000 年 1 月 1 日有什么问题?不是每个人都知道“JAN”是什么。

SQL> select to_char(date '2000-01-01', 'MON') from dual;

TO_CH
-----
JANV.

这个故事的真正寓意

如果要使用日期文字,请始终使用ANSI 日期文字DATE '2000-01-01'

于 2012-08-05T03:52:26.890 回答