안녕하세요 선배님들
얼마전에 비슷한 문의를 드려 마농님께서 좋은 답변주셔서 정말 잘 사용하고있습니다!
이번에도 해당쿼리를이용해 이것저것 해보려고 했더니 쉽지않아 문의드립니다.
구현하고자하는 내용은 아래와 같습니다.
2022-09-01~ 2022-09-30일 중에
평일인경우
2022-09-01 19:00 ~2022-09-02 07:00
까지의 데이터를 조회하고
금요일의 경우는(금요일~월요일)
09-02 19:00~09-05 07:00까지의 데이터를 조회하려고합니다.
위의 쿼리는 어느정도 구현을 해서 작성을 해놨는데 연휴가 있는경우 쿼리늘 도통 어찌해야될지 모르겠더라구요
명절(명절시작일부터 명절끝나는 평일)
09-08 19:00~ 09-13 07:00까지의 데이터를 조회하고싶습니다ㅠㅠ
변수로는 2022-09를 대입하면
예상하는 쿼리의 모양은(휴일은 테이블에 별도로 관리하고있습니다)
시작 | 종료 |
2022-09-01 19:00 | 2022-09-02 07:00 |
2022-09-02 19:00 | 2022-09-05 07:00 |
연휴 | 연휴 |
2022-09-08 19:00 | 2022-09-13 07:00 |
이런식입니다
WITH holiday AS ( SELECT '2022-01-01' dt, '양력설' nm FROM dual UNION ALL SELECT '2022-01-31', '설날전' FROM dual UNION ALL SELECT '2022-02-01', '설날' FROM dual UNION ALL SELECT '2022-02-02', '설날후' FROM dual UNION ALL SELECT '2022-03-01', '삼일절' FROM dual UNION ALL SELECT '2022-03-09', '대통렬선거' FROM dual UNION ALL SELECT '2022-05-01', '근로자의날' FROM dual UNION ALL SELECT '2022-05-05', '어린이날' FROM dual UNION ALL SELECT '2022-05-08', '석가탄신일' FROM dual UNION ALL SELECT '2022-06-01', '지방선거' FROM dual UNION ALL SELECT '2022-06-06', '현충일' FROM dual UNION ALL SELECT '2022-08-15', '광복절' FROM dual UNION ALL SELECT '2022-09-09', '추석전' FROM dual UNION ALL SELECT '2022-09-10', '추석' FROM dual UNION ALL SELECT '2022-09-11', '추석후' FROM dual UNION ALL SELECT '2022-09-12', '추석대체' FROM dual UNION ALL SELECT '2022-10-03', '개천절' FROM dual UNION ALL SELECT '2022-10-09', '한글날' FROM dual UNION ALL SELECT '2022-10-10', '한글날대체' FROM dual UNION ALL SELECT '2022-12-25', '성탄절' FROM dual ) , calendar AS ( SELECT ym , TO_DATE(ym, 'yyyy-mm') + LEVEL - 1 dt FROM (SELECT '2022-09' ym FROM dual) CONNECT BY LEVEL <= 40 ) SELECT * FROM (SELECT a.ym , TO_CHAR(a.dt, 'yyyy-mm-dd "19:00"') sdt , LEAD(TO_CHAR(a.dt, 'yyyy-mm-dd "07:00"')) OVER(ORDER BY a.dt) edt FROM calendar a LEFT OUTER JOIN holiday b ON b.dt = TO_CHAR(a.dt, 'yyyy-mm-dd') WHERE TO_CHAR(a.dt, 'd') NOT IN ('1', '7') AND b.dt IS NULL ) WHERE sdt LIKE ym || '%' ;