반응형
화면단에서 날짜를 선택하여 저장할 때 선택한 날짜가 주말이나 공휴일일 경우
그 다음 근무일(평일)로 돌려줘야하는 상황이 생겼다.
그래서 주말과 공휴일을 제외한 날짜를 구하는 쿼리를 작성해보았다!
* 2022년 9월 기준 날짜 입니다.
1. 이번달의 주말을 제외한 평일 날짜 구하기
SELECT
TM.DATES -- 날짜
,TM.DAYS -- 요일
FROM ( SELECT
TO_CHAR(START_DT + LEVEL - 1, 'YYYY-MM-DD') DATES -- 날짜
,TO_CHAR (START_DT + LEVEL - 1, 'D') DAYS -- 요일
FROM ( SELECT
TRUNC(SYSDATE,'MM') START_DT -- 이번달 시작 년월일
,TO_NUMBER(TO_CHAR(LAST_DAY(SYSDATE), 'DD')) END_DT -- 마지막 날짜
FROM DUAL ) A
CONNECT BY LEVEL <= A.END_DT ) TM -- 마지막 날짜까지 반복
WHERE TM.DAYS NOT IN ('1', '7') -- 일요일,토요일 제외
ORDER BY TM.DATES ASC
CONNECT BY LEVEL을 이용해 이번달의 시작날짜와 마지막날짜를 이용해 전체 날짜를 뽑고
1(일요일), 2(토요일)을 제외 시킨다.
결과
2. 공휴일 테이블에서 이번달 공휴일 구하기
SELECT
HOLIDAY_YEAR || '-' || HOLIDAY_MONTH || '-' || HOLIDAY_DATE AS DATES
FROM TB_HOLIDAY
WHERE HOLIDAY_YEAR = TO_CHAR(TO_DATE(SYSDATE), 'YYYY')
AND HOLIDAY_MONTH = TO_CHAR(TO_DATE(SYSDATE), 'MM')
결과
3. 두개의 결과(평일, 저장된 공휴일)를 조인하여 공휴일을 제외한 날짜 구하기
SELECT
WEEKDAY.DATES
FROM
-- 주말 제외한 평일
(SELECT
TM.DATES
,TM.DAYS
FROM (SELECT
TO_CHAR(START_DT + LEVEL - 1, 'YYYY-MM-DD') DATES
,TO_CHAR (START_DT + LEVEL - 1, 'D') DAYS
FROM ( SELECT
TRUNC(TO_DATE(SYSDATE),'MM') START_DT
,TO_NUMBER(TO_CHAR(LAST_DAY(SYSDATE), 'DD')) END_DT FROM DUAL
)
CONNECT BY LEVEL <= END_DT ) TM
WHERE TM.DAYS NOT IN ('1', '7')
ORDER BY TM.DATES ASC) WEEKDAY
-- DB에 저장된 공휴일
LEFT JOIN (SELECT
HOLIDAY_YEAR || '-' || HOLIDAY_MONTH || '-' || HOLIDAY_DATE AS DATES
FROM TB_HOLIDAY
WHERE HOLIDAY_YEAR = TO_CHAR(TO_DATE(SYSDATE), 'YYYY')
AND HOLIDAY_MONTH = TO_CHAR(TO_DATE(SYSDATE), 'MM')) HOLIDAY
ON WEEKDAY.DATES = HOLIDAY.DATES
WHERE HOLIDAY.DATES IS NULL
ORDER BY WEEKDAY.DATES ASC
결과
반응형
'DB > ORACLE' 카테고리의 다른 글
[ORACLE] 특정 컬럼 기준으로 중복데이터 제거 (ROW_NUMBER() OVER(PARTITION BY _ ORDER BY _)) (0) | 2023.05.03 |
---|---|
[ORACLE] ORDER BY 와 ROWNUM 함께 사용시 유의사항 (0) | 2022.05.03 |
[ORACLE] INSERT시 컬럼 SEQ 증가 (NVL(MAX(SEQ),0) + 1) (0) | 2022.04.18 |
[ORACLE] WHERE절에 IN 사용 (0) | 2022.04.04 |
[ORACLE] 전체 테이블 조회, 코멘트 조회 (0) | 2022.03.30 |
댓글