본문 바로가기

SQL

[오라클] 토요일/일요일/공휴일 제외 근무일수 구하는 방법

반갑습니다.

 

회사에서 ERP 개발중 일평균 출고량을 알고 싶다고 하길래

 

일평균 = 전체출고량 / 근무일수 이므로

 

근무일수를 구하는 쿼리를 알려드리겠습니다.

 

 

1. 날짜와 날짜사이를 나타낼 SELECT 문과, 공휴일을 나타낼 SELECT 문이 필요합니다.

 

2. 날짜와 날짜사이를 나타낼 SELECT 문에서 ERP 개발중 일평균 출고량을 알고 싶다고 하길래

 

 

 

일평균 = 전체출고량 / 근무일수 이므로

 

 

 

근무일수를 구하는 쿼리를 알려드리겠습니다.

 

 

 

 

 

1. 날짜와 날짜사이를 나타낼 SELECT 문과, 공휴일을 나타낼 SELECT 문이 필요합니다.

 


 

2. 날짜와 날짜사이를 나타낼 SELECT 문을 만들어 봅니다

(SELECT TO_CHAR(시작일+LEVEL-1, 'YYYYMMDD') 날짜,
    TO_CHAR(시작일+LEVEL-1,'D') 레벨
  FROM
    (SELECT TO_DATE('20200101', 'YYYYMMDD') 시작일,
      TO_DATE('20200131','YYYYMMDD') 마감일
    FROM DUAL
    )
    CONNECT BY LEVEL <= 시작일-마감일 +1
  ) A,

 

쿼리 결과

 

날짜       레벨

20200101 4
20200102 5
20200103 6
20200104 7
20200105 1
20200106 2
20200107 3
20200108 4
20200109 5
20200110 6
20200111 7



3. 공휴일 쿼리를 생성합니다.

 (SELECT '20200101' 공유일, '설날' 공휴일명 FROM DUAL ) B

 

DUAL로 정리하면 한세월이기 때문에

 

공휴일 테이블은 하나 만드시는것을 적극 권장드립니다.^^

 


4. 조건을 건다

 

SELECT COUNT(*) FROM 
(
    (SELECT TO_CHAR(시작일+LEVEL-1, 'YYYYMMDD') 날짜,
    TO_CHAR(시작일+LEVEL-1,'D') 레벨
  FROM
      (SELECT TO_DATE('20200101', 'YYYYMMDD') 시작일,
      TO_DATE('20200131','YYYYMMDD') 마감일
    FROM DUAL
      )
    CONNECT BY LEVEL <= 시작일-마감일 +1
    ) A,
  (SELECT '20200126' 공휴일날짜, '설날' 공휴일명 FROM DUAL) B
  )
  WHERE A.날짜 = B.공휴일날짜(+)  //RIGHT 조인
  AND A.레벨 NOT IN (1,7) // 토요일, 일요일 제외
  AND B.공휴일날짜 IS NULL; // 공휴일이 있는날 제외
  
  

결과값 COUNT(*) = '22'가 출력됩니다.

 

이렇게 되면 POST 값으로 시작일과, 마감일을 받아서

 

근무일자를 구한뒤 전체 출고량을 나누면 평균 출고량이 나오겠네요

 

코로나 조심하시고

 

건강챙기세요!!

 

오늘도 한건 해결!