2012-11-21 3 views
0

저는 start_session과 end_session을 가지고 있습니다.ORACLE : CHECK TIME CONSTRAINT

end_session이 start_session 이후 60 분이라는 제한 조건을 확인하고 싶습니다.

이 가능, 다음

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

데이비드, 당신은 오라클의 타임 스탬프에 대한 여러 질문, 점을 기록했다. 커뮤니티에서 답변을 얻은 후 질문을 삭제 한 이유는 무엇입니까? – bonCodigo

+0

무엇? 아무도 다른 질문에 대답하지 않았 으면, 당신은 방금 의견을 냈습니다. –

+0

내 의견은 대답이었고 여기에 내 의견과 답글을 게시해야합니까? 대답이 그렇게 분명하기 때문에 당신이 기분이 좋지 않습니까? – bonCodigo

답변

2

H 감수는 Check 제약 제한의 ​​종류를 부과하는 데 사용할 수있는 방법입니다 start_sessionend_session 열 위의 예에서

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 

timestamp 데이터 형입니다. 당신이있는 경우이를 Date 데이터 타입으로 선언 다음 check 제약 조건에 대한 공식은 수 있습니다 :

(end_session - srtart_session) >= 1/24