쿼리 질문입니다. 0 3 2,148

by sendo [SQL Query] 중복 시간 시간표 [2012.04.30 16:16:24]


안녕하세요.



WITH t AS
(
select '1234' as leccode,'요가' as lecname, '01' as clssday,'0900' as fromtime,'1200' as totime from dual
union all select '2345','골프', '01','1230','1800' from dual
union all select '3456','헬스', '01','1300','1500' from dual
)
, y as
(
select '2012001' as idnum,'1234' as leccode from dual
)
select * from y,t
where y.leccode=t.leccode
and fromtime <= 1230 --수강신청할려고 하는 강좌의 시작시간
and totime > 1230    --수강신청할려고 하는 강좌의 시작시간
and fromtime < 1800  --수강신청할려고 하는 강좌의 종료시간
and totime >= 1800   --수강신청할려고 하는 강좌의 종료시간


학생이 수강신청할려고 선택한 강좌가 이미 수강신청한 강좌와 시간이 겹치는지 확인하는 쿼리를 만들려고 하는데요..
이미 수강신청한 강좌의 시작,종료시간에 신청할려고하는 강좌의 시작시간,종료시간이 포함되는지 체크할려고 했는데.
가만 생각해 보니..골프같은 시간대는 체크가 안되더라구요..
where 조건을 어떻게 주어야 할까요?
테이블 설명을 드리면
t 테이블은 강좌정보 테이블입니다. 강좌코드,강좌명,요일,시작시간,종료시간 입니다.
y 테이블은 학생별 수강정보 테이블입니다. ID,강좌코드 입니다.
------------------------------------------------------------

그리고 t 테이블의 정보로 시간표를 만들려고 하는데.
위의 예제에서는 요일(clssday)은 같게 주었는데 
원래는 아래와 같이 요일이 들어있습니다.t테이블로 시간표를 쿼리로 만드는게 가능한가요.
clssday 01은 월요일,02는 화요일,03은 수요일입니다.


WITH t AS
(
select '1234' as leccode,'요가' as lecname, '01' as clssday,'0900' as fromtime,'1200' as totime from dual
union all select '2345','골프', '02','1230','1800' from dual
union all select '3456','헬스', '03','1300','1500' from dual
)
select * from t


답변부탁드립니다~
by 마농 [2012.04.30 17:23:19]
SELECT *
  FROM y
     , t -- 기수강신청 y 와 조인 될 테이블
     , t x -- 신규 수강신청할 과목 조건 줄 테이블
 WHERE y.leccode = t.leccode -- 기수강과목 시간 조인
   AND y.idnum = '2012001' -- 로그인ID
   AND x.leccode = '2345' -- 신규신청과목ID
   AND t.clssday = x.clssday -- 요일 비교
   AND t.fromtime < x.totime -- 시작과 종료시간을 교차 비교
   AND t.totime > x.fromtime -- 시작과 종료시간을 교차 비교
;

by 마농 [2012.04.30 17:33:44]
WITH t AS
(
SELECT '1234' leccode,'요가' lecname, '01' clssday, '0900' fromtime, '1200' totime FROM dual
UNION ALL SELECT '2345', '골프', '01', '1230', '1800' FROM dual
UNION ALL SELECT '2345', '골프', '02', '1230', '1800' FROM dual
UNION ALL SELECT '3456', '헬스', '03', '1300', '1500' FROM dual
)
, tm AS
(
SELECT LPAD(LEVEL + 8, 2, '0') || '00' fromtime
     , LPAD(LEVEL + 9, 2, '0') || '00' totime
  FROM dual
 CONNECT BY LEVEL <= 9
)
SELECT fromtime, totime
     , MIN(DECODE(clssday, '01', w)) w01
     , MIN(DECODE(clssday, '02', w)) w02
     , MIN(DECODE(clssday, '03', w)) w03
     , MIN(DECODE(clssday, '04', w)) w04
     , MIN(DECODE(clssday, '05', w)) w05
     , MIN(DECODE(clssday, '06', w)) w06
     , MIN(DECODE(clssday, '07', w)) w07
 FROM (SELECT tm.fromtime, tm.totime, t.clssday
             , wm_concat(t.lecname || '(' || t.fromtime || '~' || t.totime || ')') w
          FROM t, tm
         WHERE t.fromtime(+) < tm.totime
           AND t.totime(+) > tm.fromtime
         GROUP BY tm.fromtime, tm.totime, t.clssday
        )
 GROUP BY fromtime, totime
;

by 손님 [2012.05.02 09:05:19]
답변 감사합니다~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입