안녕하세요 선배님들
얼마전에 비슷한 문의를 드려 마농님께서 좋은 답변주셔서 정말 잘 사용하고있습니다!
이번에도 해당쿼리를이용해 이것저것 해보려고 했더니 쉽지않아 문의드립니다.
구현하고자하는 내용은 아래와 같습니다.
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 |
이런식입니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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 || '%' ; |