postgreSQL 에서 시작일자와 종료일자 사이의 날짜들에 대해 공휴일을 제외하고 데이터 추출 하려고 하는데요.
테이블이
seq startDate endDate
1 20170101 20170105
2 20170102 20170103
처럼 데이터가 있을 때
결과를
seq startDate endDate indate
1 20170101 20170105 20170102
1 20170101 20170105 20170103
1 20170101 20170105 20170104
1 20170101 20170105 20170105
2 20170102 20170103 20170102
2 20170102 20170103 20170103
이런식으로 나오게 하려고 하는데 어떻게 쿼리를 짜야될까요?
달력 테이블이 있으면 이를 이용하여 조인하시면 됩니다.
달력 테이블이 없으면 만드시길 권합니다.
SELECT b.seq , b.startDate , b.endDate , a.indate FROM calendar_t a INNER JOIN data_t b ON a.indate BETWEEN b.startDate AND b.endDate WHERE a.week_dy NOT IN ('1','7') -- 토, 일 제외 AND a.holi_yn = 'N' -- 공휴일 제외 ORDER BY b.seq, a.indate ;
달력 테이블 없이 공휴일 테이블만 관리한다면?
WITH data_t(seq, startDate, endDate) AS ( SELECT 1, '20180101', '20180105' UNION ALL SELECT 2, '20180102', '20180103' ) , holiday_t AS ( SELECT '20180101'::varchar dt ) SELECT a.seq, a.startDate, a.endDate , TO_CHAR(a.dt, 'yyyymmdd') indate FROM (SELECT seq, startDate, endDate , generate_series(startDate::date, endDate::date, interval '1' day) dt FROM data_t ) a LEFT OUTER JOIN holiday_t b ON TO_CHAR(a.dt, 'yyyymmdd') = b.dt WHERE TO_CHAR(a.dt, 'd') NOT IN ('1','7') AND b.dt IS NULL ;