2012-11-21 38 views
0

我有一個start_session和end_session。ORACLE:CHECK TIME CONSTRAINT

我想確保在start_session之後60分鐘的end_session約束。

這是可能的,像下面

ALTER TABLE BOOKING_SESSION ADD CONSTRAINT SESSION_LENGHT CHECK (END_SESSION > START_SESSION + 60 MINUTES); 

我得到了下面的觸發器來檢查啓動會議不超過年底召開一次會議大(感謝賈斯汀洞)

CREATE OR REPLACE TRIGGER trg_check_dates 
    BEFORE INSERT OR UPDATE ON BOOKING_SESSION 
    FOR EACH ROW 
BEGIN 
    IF(:NEW.END_SESSION < :NEW.START_SESSION) 
    THEN 
    RAISE_APPLICATION_ERROR(-20001, 
      'Invalid: END_SESSION must be greater than START_SESSION = ' || 
      to_char(:NEW.START_SESSION, 'YYYY-MM-DD HH24:MI:SS')); 
    END IF; 
END; 
/

但是,我需要一個確保結束會議是一小時後start_session

+0

大衛,你,貼在Oracle多個問題,考慮到時間戳記。爲什麼在從社區獲得答案後刪除了你的問題? – bonCodigo

+0

什麼?沒有人回答另一個問題,你只是發表了評論。 –

+0

我的評論是答案,應該在這裏發表我的評論和你的回覆?答案是否讓你感覺不好,因爲它很明顯? – bonCodigo

回答

2

H ERE是Check約束如何可以被用來施加那種限制:

SQL> create table Tb_test(
    2 id number not null primary key, 
    3 start_session timestamp, 
    4 end_session timestamp 
    5 ) 
    6 ; 

Table created 

SQL> 
SQL> alter table tb_test 
    2 add constraint CHK_SES_TIME 
    3 check ((end_session is null) or ((end_session - start_session) >= interval '1' hour)) 
    4 ; 

Table altered 

-- data that is violate our constraint 
SQL> insert into tb_test(id, start_session, end_session) 
    2 values(1, systimestamp, systimestamp) 
    3 ; 

insert into tb_test(id, start_session, end_session) 
    values(1, systimestamp, systimestamp) 

ORA-02290: check constraint (HR.CHK_SES_TIME) violated 

-- valid data 
SQL> insert into tb_test(id, start_session, end_session) 
    2 values(1, systimestamp, systimestamp + interval '1' hour) 
    3 ; 

1 row inserted 

-- only start session added, end_session is null. 
SQL> insert into tb_test(id, start_session) 
    2 values(2, systimestamp) 
    3 ; 

1 row inserted 

SQL> commit; 

Commit complete 

-- updating end_session with data that violate check constraint 
SQL> update tb_test 
    2 set end_session = systimestamp; 

update tb_test 
    set end_session = systimestamp 

ORA-02290: check constraint (HR.CHK_SES_TIME) violated 

-- updating end_session with valid data 


SQL> update tb_test 
    2 set end_session = systimestamp + interval '1' hour; 

1 row updated 

在上述start_sessionend_session列的示例是timestamp數據類型的。如果你有他們聲明爲Date數據類型則公式爲check約束可能是:

(end_session - srtart_session) >= 1/24