postgreSQL 에서 시작일자와 종료일자 사이의 날짜들에 대한 데이터 추출 0 3 831

by 카츠네야 [SQL Query] [2018.01.08 17:14:43]


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

이런식으로 나오게 하려고 하는데 어떻게 쿼리를 짜야될까요?

by 마농 [2018.01.08 17:34:58]

달력 테이블이 있으면 이를 이용하여 조인하시면 됩니다.
달력 테이블이 없으면 만드시길 권합니다.
 

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
;

 


by 카츠네야 [2018.01.09 14:25:14]

네 감사합니다

켈린더 테이블을 쓰면 간단하게 해결이 되네요

켈린더 테이블에 주말과 공휴일까지 구분해줘서 더 쉽게 해결이 되었습니다.


by 우리집아찌 [2018.01.09 14:59:38]

캘린더 테이블(공휴일테이블) 은  음력공휴일(설날,추석) / 회사 창립일 / 임시공휴일(선거일) 경우에 유용히 쓰입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입