일단 휴일 관리하는 테이블이 별도로 있습니다.
select
(select
dt_wk --영업일
from h_calendar
where dt_cal = '20161122') -
(select
dt_wk --영업일
from h_calendar
where dt_cal = '20161101') 영업일,
(select
dt_wk --영업일
from h_calendar
where dt_cal = '20161130') -
(select
dt_wk --영업일
from h_calendar
where dt_cal = '20161101') 당월영업총일,
(select
dt_wk --영업일
from h_calendar
where dt_cal = '20161130') -
(select
dt_wk --영업일
from h_calendar
where dt_cal = '20161122') 남은영업일
from dual;
이렇게 하면 되기는 하나 이걸로 다시 계산이 들어가야 하는데 그러면 너무 지저분해져서 함수로 처리 하고 싶습니다.
H_CALENDAR 이 테이블이 휴일테이블인데
dt_cal 해당 컬럼은 일자가 들어가는 필드이고(yyyyMMdd)이런식으로
dt_wk 해당 컬럼은 워킹데이가 1 2 3 이런식으로 들어가고 있습니다 그리고 휴일일경우에는 1 2 3 3 이런식으로 워킹데이가 증가하지 않습니다.
fg_cal 해당 컬럼이 H가 오게 되면 휴일로 되어 dt_wk값이 증가 하지 않습니다.
select dt_cal,dt_ac_wk,fg_cal
from h_calendar
where fg_cal not in ('h')
이렇게 하면 휴일없이 나오는데...
고수님들의 조언부탁드립니다.
dt_wk 가 1,2,3,3 으로 증가하는데 기준이 어떻게 되나요?
- 월 기준 초기화 인가요?
- 연 기준 초기화 인가요?
- 아니면 초기화 없이 증가만 하나요?
월기준 초기화 한다면?
- 영업일과, 당월영업총일 구할 때 굳이 1일자의 값을 뺄 것이 아니라
- 해당 일자(11/22)의 dt_wk 값만 구하면 될 것이구요.
매월 초기화 되는게 아니라면?
- 비교일자 값을 빼는것은 맞지만 거기에 1 을 더해줘야 맞을 듯 하네요.
- (11/22 의 값) - (11/1 의 값) + 1 AS 영업일
영업일 컬럼을 이용해 계산하는 방법도 있지만
- 휴일 빼고 카운트 하는 방법도 있습니다.
-- 1. 매월 초기화 되어 1부터 시작하는 경우 -- SELECT MIN(DECODE(dt_cal, v_dt, dt_wk)) 영업일 , MAX(dt_wk) 당월영업총일 , MAX(dt_wk) - MIN(DECODE(dt_cal, v_dt, dt_wk)) 남은영업일 FROM h_calendar , (SELECT '20161122' v_dt FROM dual) -- 조회일자 WHERE dt_cal LIKE SUBSTR(v_dt, 1, 6) || '%' ; -- 2. 매월 초기화 되는 경우가 아닌 경우 -- SELECT MIN(DECODE(dt_cal, v_dt, dt_wk)) - MIN(dt_wk) + 1 영업일 , MAX(dt_wk) - MIN(dt_wk) + 1 당월영업총일 , MAX(dt_wk) - MIN(DECODE(dt_cal, v_dt, dt_wk)) 남은영업일 FROM h_calendar , (SELECT '20161122' v_dt FROM dual) -- 조회일자 WHERE dt_cal LIKE SUBSTR(v_dt, 1, 6) || '%' ; -- 3. Count 를 이용하는 방법 SELECT COUNT(CASE WHEN dt_cal <= v_dt THEN 1 END) 영업일 , COUNT(*) 당월영업총일 , COUNT(CASE WHEN dt_cal > v_dt THEN 1 END) 남은영업일 FROM h_calendar , (SELECT '20161122' v_dt FROM dual) -- 조회일자 WHERE dt_cal LIKE SUBSTR(v_dt, 1, 6) || '%' AND fg_cal != 'h' ;