2016-10-11 55 views
0

我試圖創建一個約束檢查記錄不超過2016約束使用DATE

這裏是我的數據庫中的記錄

enter image description here

這裏是我的查詢:

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE <=TO_DATE('01-JAN-16')); 

但我得到了一個錯誤說:ERROR位於第1行:

ORA-02436: date or system variable wrongly specified in CHECK constraint.

我檢查了一些類似的問題在這個網站上,但有解決方案不能解決我的問題。

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

回答

3

一種選擇是使用extract()功能因爲你只是想檢查的一年:

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (extract(year from SIGHTING_DATE) < 2016); 

或使用ANSI日期文字:

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE < date '2016-01-01'); 
+0

我試過這兩個選項,但我得到這個錯誤:ORA-02293:無法驗證(S4369490.CK_SIGHTING_DATE) - 檢查約束 違反。 –

+0

@SeanLi:那麼顯然你插入的行違反了該規則(例如2016年的日期) –

+0

你的意思是已經存在一些違反該規則的記錄嗎? –

0

你必須做出日期specifcation

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE <= 
       /*TO_DATE('01-JAN-16','DD-MON-YY') as I was pointed your should specify 4 digits for year*/ 
       TO_DATE('01-JAN-2016','DD-MON-YYYY')); 

ALTER TABLE SIGHTINGS 
    ADD CONSTRAINT CK_SIGHTING_DATE 
    CHECK (SIGHTING_DATE <=DATE'2016-01-01'); 

另一個事物的你是什麼意思,當你說「不更大於2016年」 你在01-檢查alow日期2016年1月,但不允許02-Jan-2016。 如果你想包括全2016年寫

SIGHTING_DATE < DATE'2017-01-01' 

或 TRUNC(SIGHTING_DATE, 'YY')< = DATE'2016-01-01'

+2

''' 01-JAN-16','DD-MON-YY'取決於當地的NLS_DATE_LANGUAGE,對於英文以外的其他語言可能會失敗。另外兩位數字的'16'不是很聰明。 –

+0

它是如何依賴的?我寫一個字符串並指定一個格式。從2000年到2099年整個世紀它將返回2016年1月1日。 –

+0

當我嘗試你的第一個建議時,我得到了同樣的錯誤:** ORA-02436:在CHECK約束中錯誤指定的日期或系統變量** –