Database 未完全指定的日期常量

Database 未完全指定的日期常量,database,oracle,default-value,check-constraints,Database,Oracle,Default Value,Check Constraints,在Oracle中,“未完全指定的日期常量”是什么意思?有什么例子吗?根据文档,不能在“检查约束”和“默认值”列中指定它。这是来自的一行。我认为这意味着默认日期必须正确格式化 因此,假设我们需要一个默认日期为当前年份第一天的规则。这是有效的: create table t1 (d1 date default to_date('01-JAN', 'DD-MON')); 鉴于此声明 create table t1 (d1 date default to_date('01-JAN')); 。。。hu

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

这是来自的一行。我认为这意味着默认日期必须正确格式化

因此,假设我们需要一个默认日期为当前年份第一天的规则。这是有效的:

create table t1 (d1 date default to_date('01-JAN', 'DD-MON'));
鉴于此声明

create table t1 (d1 date default to_date('01-JAN'));
。。。hurls
ORA-01840:输入值不够长,不适合日期格式

这是来自的一行。我认为这意味着默认日期必须正确格式化

因此,假设我们需要一个默认日期为当前年份第一天的规则。这是有效的:

create table t1 (d1 date default to_date('01-JAN', 'DD-MON'));
鉴于此声明

create table t1 (d1 date default to_date('01-JAN'));
。。。hurls
ORA-01840:输入值不够长,不适合日期格式

从这里得到了答案

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

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

因此,如果sysdate中的年份是1900,那么'02-jan-12'可能是'02-jan-1912' 如果sysdates的年份是2000年,那么可能是2012年

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

例如,当它取决于其他变量时,例如取决于世纪数据的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日有什么问题?不是每个人都知道“简”是什么

这个故事的真正寓意


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

我认为文档是错误的。可以在约束或默认值中使用未完全指定的日期常量。在某些情况下,即使是“完全指定”的日期常量也可能失败。我不确定文档的确切含义,但我认为真正的问题是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日有什么问题?不是每个人都知道“简”是什么

这个故事的真正寓意


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

是否可以提供阅读此文档的链接?是否可以提供阅读此文档的链接?但在任何上下文中都不是这样?无效的日期表达式在任何地方都不起作用。为什么文档只在几个特定的地方提到它?但在任何上下文中都不是这样吗?无效的日期表达式在任何地方都不起作用。为什么文档只在几个特定的地方提到它?