시간 입력 시 전의 값과 비교해서 입력하는건데.. 0 3 7,822

by 김용환 [SQL Query] [2010.09.10 12:55:10]



하음! 오라클 초보가 다시 한번 질문 올립니다 흑

저장되어 있는 시간을 비교하여 신규값을 입력할때 중첩되면 오류 메시지를 뿌리는 쿼리 입니다.

테이블 구성은

A라는 테이블에

 FR_TIME TO_TIME
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
 18    22

라고 가정하였을때

신규 입력 할때
시작시간(FR_TIME) 에는 18 보다 크거나 작아야 하며 22 보다는 같거나 커야 합니다.
종료시간(TO_TIME) 에는 22 보다 크거나 작아야 하며 18 보다는 같거나 작아야 합니다.

쉽게 말해..
시작시간에 18 ~ 21 가 입력되면 오류,
종료시간에 19 ~ 22 가 입력되면 오류
인겁니다.

둘중 하나라도 입력된 값이 오류라면 메시지를 출력~

아아악!! 내가 질문하고도 내가 뭔말하고 있는지 모르겠어 ...!
by 마농 [2010.09.10 13:17:09]
-- cnt가 0 이면 정상 1 이면 중복 --
SELECT COUNT(*) cnt
FROM 테이블
WHERE fr_time < :v_to_time
AND to_time > :v_fr_time
AND ROWNUM = 1
;

by v상이v [2010.09.10 13:18:43]
흠...이런거 인가요??



SELECT DECODE(COUNT(FR_TIME),0,'정상','오류') MSG
FROM (SELECT '18' FR_TIME, '22' TO_TIME FROM dual)
WHERE :V1 IS NULL --시작시간(V1) 입력체크
OR :V2 IS NULL --종료시간(V2) 입력체크
OR :V1 BETWEEN FR_TIME AND (TO_TIME - 1) --시작시간(V1) 유효성체크
OR :V2 BETWEEN (FR_TIME + 1) AND TO_TIME --종료시간(V2) 유효성체크
OR :V1 > :V2 --시작시간(V1)이 종료시간(V2)보다 더 큰 경우 체크

by 마농 [2010.09.10 15:20:57]
흔히들 기간 중복 체크 문제에서 복잡한 쿼리를 사용하는 경우가 많은데요.
중복 가능한 각각의 케이스를 조건으로 만들어 Or로 연결하는 방법이죠.
다음 6가지 케이스로 분류할 수 있겠는데요.
1. 시작 ~ 종료 안에 :시작, :종료가 포함되는 경우
2. 시작 ~ 종료 안에 :시작이 포함되는 경우
3. 시작 ~ 종료 안에 :종료가 포함되는 경우
4. 시작 ~ 종료 를 :시작, :종료가 포함하는 경우
5. 시작 ~ 종료 앞에 :시작, :종료가 있는 경우
6. 시작 ~ 종료 뒤에 :시작, :종료가 있는 경우
1~4번 케이스가 중복이 되는 경우죠.

하지만 위 4가지 조건은 잘 따지고 보면 결국 하나로 압축됩니다.
7. 시작이 :종료보다 작고 종료는 :시작보다 큰 경우
위 1~4번 조건에 7번 조건을 각각 대입해보면 잘 맞아 떨어진다는 것을 알 수 있습니다.
조건이 너무나도 단순하여 오히려 믿질 않는 사람이 많더군요.
하지만 이 조건은 너무나도 단순하면서도 강력한 조건입니다.

다음은 기간검색 관련해서 제가 일전에 냈었던 퀴즈입니다.
http://www.gurubee.net/article/45391
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입