2012-08-02 21 views
2

在Oracle中,「日期常量沒有完全指定」。是什麼意思?任何例子?根據文檔,不能在檢查約束和列默認值中指定它。未完全指定的日期常量

+2

你能否提供在您閱讀本文檔的鏈接? – 2012-08-02 05:27:13

回答

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

+0

但是在任何情況下都不是這樣嗎?無效的日期表達式在任何地方都無法工作。爲什麼文檔只在幾個特定的​​地方提到它? – 2012-08-02 18:20:46

0

得到的答案從這裏https://forums.oracle.com/forums/message.jspa?messageID=10494087#10494087

未完全指定意味着日期格式,可能導致模棱兩可或不同的值,

例如,當這取決於其他因素,諸如依賴於RR格式對SYSDATE的世紀數據,

所以'02 -JAN-12' 可能是'02 -JAN-1912' 如果SYSDATE年份是1900 ,並可能在2012年,如果sysdates年是2000

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'