아래와같이 하니 가져오긴하는데 너무길어서 좀간단하게 가져올수잇는 방법이 없을까요?
-- from to 날짜사이의 15일날짜가 몇개있는지 체크
WITH T AS
(
select to_date(:frDt,'yyyymmdd') as frDt
, to_date(:toDt,'yyyymmdd') as toDt
, ceil(months_between( to_date(:toDt,'yyyymmdd'), to_date(:frDt,'yyyymmdd') )) as d_cnt
from dual
)
select sum(case when (case when to_date(to_char(add_months(t.frDt,rownum-1),'yyyymm')||'15','yyyymmdd') >= t.frDt and to_date(to_char(add_months(t.frDt,rownum-1),'yyyymm')||'15','yyyymmdd') <= t.toDt then
to_date(to_char(add_months(t.frDt,rownum-1),'yyyymm')||'15','yyyymmdd')
else
null
end) is null
then 0
else 1
end
) as cnt
from t
connect by rownum <= d_cnt
;
SELECT :FRDT FRDT, :TODT TODT
, SUM(DECODE(TO_CHAR(TO_DATE(:FRDT) + ROWNUM - 1,'DD'),'15',1,0)) CNT
FROM DUAL
CONNECT BY LEVEL <= TO_DATE(:TODT)- TO_DATE(:FRDT) + 1
;
select months_between(trunc(todt,'MM'),trunc(frdt,'MM')) + 1
- (case when frdt > trunc(frdt,'MM') + 14 then 1 else 0 end)
- (case when todt < trunc(todt,'MM') + 14 then 1 else 0 end) days
from t
15일 이라는 특수성을 고려한 15일 전용 쿼리입니다.
일자가 선택사항이라면 이 쿼리를 적용할 수 없습니다.
SELECT MONTHS_BETWEEN( ROUND(TO_DATE(:toDt, 'yyyymmdd')+1, 'mm') , ROUND(TO_DATE(:frDt, 'yyyymmdd') , 'mm') ) AS cnt_15 FROM dual ;