날짜계산 워킹데이기준 0 3 4,267

by 임태원 [SQL Query] [2017.12.22 14:52:53]


날짜1 날짜2 차이
20171204 20171208 4
20171208 20171212 3

위와 같은 A테이블이 있고,

똑같이 4일차이가 나지만 워킹데이 기준으로 일요일(또는 공휴일)을 제외하고 카운트하고 싶습니다.

테이블은 날짜 테이블이 있습니다.(날짜테이블 B)

날짜 휴일구분
20171209 null
20171210 1
20171211 null

 

SAS에서는

   SELECT 날짜1,
          날짜2,
            (select count(*) from 테이블B  where B.날짜 between A.날짜 and A.날짜1)  as 휴일포함,
            (select count(*) from 테이블B  where B.날짜 between A.날짜 and A.날짜1 and 휴일구분 is null) as 휴일제외
      FROM 테이블A
      WHERE 날짜2 BETWEEN '20171201' AND '20171231'
      GROUP BY 날짜1
               날짜2;

 

이렇게 짜면 위와 테이블 A 의 차이를 구할수 있는데

 

oracle 에서는 도무지 위와같은 코드로 되질 않습니다.

고수분들 답변 부탁드립니다.

 

by 우리집아찌 [2017.12.22 15:07:29]
-- 휴가 12-4 ~ 12-8 일이면 5일 아닌가요?
WITH TB_VACATION AS (
SELECT 1 ID , '20171204' ST_DT , '20171208' ED_DT , 4 DIFF FROM DUAL UNION ALL
SELECT 2 ID , '20171208' ST_DT , '20171212' ED_DT , 3 DIFF FROM DUAL 
) , TB_HOLIDAY AS (
/*그냥 만듬*/
SELECT TO_DATE( '20171201' , 'YYYYMMDD' ) + LEVEL - 1  DY 
     , CASE TO_CHAR(TO_DATE( '20171201' , 'YYYYMMDD' ) + LEVEL - 1  ,'D') 
            WHEN '7' THEN '1' 
            WHEN '1' THEN '1'
        END  GB
  FROM DUAL CONNECT BY LEVEL <= 31
)

SELECT B.ID , MIN(B.ST_DT) ST_DT , MAX(B.ED_DT) ED_DT , COUNT(*) CNT
  FROM TB_HOLIDAY A
     , TB_VACATION  B 
 WHERE A.DY BETWEEN TO_DATE(B.ST_DT,'YYYYMMDD') AND TO_DATE(B.ED_DT,'YYYYMMDD') 
   AND A.GB IS NULL 
 GROUP BY B.ID
 

 


by 임태원 [2017.12.22 16:27:01]

휴가라는 개념이 아니라.
4일날 발생된 문제가 8일날 해결되었으므로

4일만에 해결했다 이런의미입니다.

8일날 발생된 문제는 12일날 해결되어 4일이 걸렸지만, 중간에 공휴일이 하루가 껴서. 근무일수 기준으로는 3일만에 해결했다는 의미이구요.


by 우리집아찌 [2017.12.22 16:55:38]

4박 5일이면 4박만 가져오고싶으신건가요?

하루식 빼시려면 st_dt -1 해주세요.

 

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