[질문] 두날짜사이의 특정일이 몇개 있는지 가져오는쿼리 제가짜봤는데 쉽게가져오는방법이 없을까요? 0 3 2,005

by 김용한 [2015.08.06 15:54:27]


아래와같이 하니 가져오긴하는데 너무길어서 좀간단하게 가져올수잇는 방법이 없을까요?

-- 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
;

by 창조의날개 [2015.08.06 16:25:21]

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
;

 


by jkson [2015.08.06 16:33:55]
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    

 


by 마농 [2015.08.07 09:12:51]

15일 이라는 특수성을 고려한 15일 전용 쿼리입니다.
일자가 선택사항이라면 이 쿼리를 적용할 수 없습니다.
 

SELECT MONTHS_BETWEEN( ROUND(TO_DATE(:toDt, 'yyyymmdd')+1, 'mm')
                     , ROUND(TO_DATE(:frDt, 'yyyymmdd')  , 'mm')
                     ) AS cnt_15
  FROM dual
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입