Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 이펙티브자바
- JPA
- 독서리뷰
- 독서
- 공부
- 우아한테크코스
- Head First Design Pattern
- Eclipse
- 프로그래머스
- 인코딩
- math
- 디자인패턴
- Java
- 카카오톡1차
- 오라클
- 알고리즘
- Oracle
- 람다
- 인프런
- javascript
- Singleton
- 자바
- study
- spring
- 에러
- 후기
- 매핑
- 회고
- 인강리뷰
- Design Pattern
Archives
- Today
- Total
Lee's Grow up
[오라클/Oralce] 쿼리/query 주말 및 공휴일을 제외한 날짜 구하기, 영업일 구하기 or 주말 구하기 본문
반응형
본 포스팅은 쿼리를 통해서 주말/공휴일을 제외한 영업일을 구하는 방식을 소개합니다.
- 1년 단위 주말 및 공휴일 제외한 날짜
- 달의 특정 날짜에서 주말 및 공휴일을 제외한 날짜 ( 단 예외 상황이 존재 자세한 내용은 아래 설명 참고 )
1. ORACLE 쿼리
- 1년 달력을 기준으로 주말 및 공휴일 제외 날짜를 구하는 쿼리입니다.
SELECT A.DT,
FROM ( SELECT TO_CHAR (SDT + LEVEL - 1, 'YYYY-MM-DD') DT,
TO_CHAR (SDT + LEVEL - 1, 'D') D
FROM (SELECT TO_DATE((TO_CHAR(SYSDATE, 'YYYY')||'01-01'),'YYYY-MM-DD') SDT,
TO_DATE((TO_CHAR(SYSDATE, 'YYYY')||'12-31'),'YYYY-MM-DD') EDT
FROM DUAL)
CONNECT BY LEVEL <= EDT - SDT + 1) A,
(
SELECT HOLIDAY DT
FROM HOLI_TABLE
WHERE TO_CHAR(HOLIDAY,'YYYY') >= TO_CHAR(SYSDATE,'YYYY')
) B
WHERE TO_DATE(A.DT,'YYYY-MM-DD') = B.DT(+)
AND A.D NOT IN ('1', '7')
AND B.DT IS NULL
ORDER BY A.DT ASC
- 달의 특정 날짜에서 주말 및 공휴일을 제외한 날짜
SELECT * FROM (
SELECT A.DT,A.D
FROM
(SELECT TO_CHAR(SDT + LEVEL - 1, 'YYYY-MM-DD') DT
,TO_CHAR (SDT + LEVEL - 1, 'D') D
FROM (
SELECT TRUNC(SYSDATE,'MM') SDT
,TO_DATE((TO_CHAR(SYSDATE, 'YYYY-MM')||'24'),'YYYY-MM-DD') EDT FROM DUAL
)
CONNECT BY LEVEL <= EDT - SDT + 1 ) A,
(
SELECT HOLIDAY DT
FROM IS_DC15
WHERE TO_CHAR(holiday,'YYYY') >= TO_CHAR(sysdate,'YYYY')
) B
WHERE TO_DATE(A.DT,'YYYY-MM-DD') = B.DT(+)
AND A.D NOT IN ('1', '7')
ORDER BY A.DT DESC)
WHERE ROWNUM <= 3
* 공휴일은 입력된 테이블이 존재해야 합니다. 없다면 B라고 별칭을 준 조인부분을 제외하면
주말만 체크하여 영업일을 확인할 수 있습니다.
여기서, 해당 날짜의 영업일을 구하는 쿼리는 임시로 제 월급일인 24일 기준으로 영업일 3일전을 구하는 쿼리입니다.
인라인뷰로 사용되는 값이 해당 월의 1일부터 마지막일 까지이기 때문에... 예를들어 해당월의 3일의 영업일 4일전 같은 쿼리는 해당 쿼리에서 구할 수 없기 때문에 전체 날짜를 구하는 첫번째 쿼리를 사용하시면 될 것 같습니다.
반대로 주말 및 공휴일을 구하는 쿼리입니다.
SELECT A.DT
FROM ( SELECT TO_CHAR (SDT + LEVEL - 1, 'YYYY-MM-DD') DT,
TO_CHAR (SDT + LEVEL - 1, 'D') D
FROM (SELECT TO_DATE((TO_CHAR(SYSDATE, 'YYYY')||'01-01'),'YYYY-MM-DD') SDT,
TO_DATE((TO_CHAR(SYSDATE, 'YYYY')||'12-31'),'YYYY-MM-DD') EDT
FROM DUAL)
CONNECT BY LEVEL <= EDT - SDT + 1) A,
(
SELECT HOLIDAY DT
FROM HOLI_TABLE
WHERE TO_CHAR(HOLIDAY,'YYYY') >= TO_CHAR(SYSDATE,'YYYY')
) B
WHERE TO_DATE(A.DT,'YYYY-MM-DD') = B.DT(+)
AND (
A.D IN ('1', '7')
OR B.DT IS NOT NULL
);
위에서 실행 된 쿼리에서 약간 변형을 주어서 날짜값이 NOT IN ('1','7')
이 아닌
주말을 찾고 싶기 때문에 IN ('1', '7')
로 변경해줍니다. 사실 다들 아실거지만... 그래도 혹시 몰라서 작성했습니다.
반응형
'DB > ORACLE' 카테고리의 다른 글
Comments