2015-04-08 38 views
0

因此,我需要一個約束來防止用戶輸入季度的第一天和季度的最後一天以外的日/月,以及日期該表將被「鎖定」以進行編輯。我在網上做了一些搜索,並認爲我找到了答案,但是當我嘗試時,我得到了一個錯誤。僅在Oracle SQL中檢查日期和月份的約束條件

alter table TABLE_NAME 
    add constraint data_beg_dt_chk check 
(trunc(data_beg_dt, 'DD-MON') = (trunc(to_date('01-JAN', 'DD-MON'))||(trunc(sysdate, 'YYYY'))) 
    OR trunc(data_beg_dt, 'DD-MON') = (trunc(to_date('01-APR', 'DD-MON'))||(trunc(sysdate, 'YYYY'))) 
    OR trunc(data_beg_dt, 'DD-MON') = (trunc(to_date('01-JUL', 'DD-MON'))||(trunc(sysdate, 'YYYY'))) 
    OR trunc(data_beg_dt, 'DD-MON') = (trunc(to_date('01-OCT', 'DD-MON'))||(trunc(sysdate, 'YYYY')))); 

我得到的錯誤:

SQL Error: ORA-02436: date or system variable wrongly specified in CHECK constraint 
02436. 00000 - "date or system variable wrongly specified in CHECK constraint" 

*Cause: An attempt was made to use a date constant or system variable, 
      such as USER, in a check constraint that was not completely 
      specified in a CREATE TABLE or ALTER TABLE statement. For 
      example, a date was specified without the century. 

*Action: Completely specify the date constant or system variable. 
      Setting the event 10149 allows constraints like "a1 > '10-MAY-96'", 
      which a bug permitted to be created before version 8. 

有誰知道另一種方式,我可以只使用一天,一個月,但同時保持本年度用戶已enetered?

感謝

回答

5

你不能有一個datedatetime沒有一年的時間,但你想創建這樣的日期與to_date()功能。日期是他們自己的數據類型。您不能創建部分日期並將它們連接起來,就像它們是字符串一樣(儘管您可以使用實際的charvarchar數據來實現)。而且,你讓它比需要的更難。 Oracle的EXTRACT()函數可以從日期中提取日期和/或月份的數字,這就是您真正想要的,尤其是考慮到您可以按月計算數字。

例如:

alter table TABLE_NAME 
    add constraint data_beg_dt_chk 
    check EXTRACT(day from data_beg_dt) = 1 
     and MOD(EXTRACT(month from data_beg_dt), 3) = 1; 

注意與約束你試着寫,上面並沒有限制的日期是在當前年份。如果Oracle甚至接受了這樣一個約束,那麼它會導致一個表格,每個新的一年,每一行都會從服從約束到違反約束,而沒有任何數據發生變化。

如果您希望數據庫阻止表在某個日期範圍之外被修改,或者您想要根據當前日期限制對某些行的更改,那麼您應該查看觸發器而不是表約束那個目的。

+0

非常感謝約翰 - 那就是訣竅。 – patkipper