근무일자 계산 0 1 747

by 스트레스 [SQL Query] 근무일계산 [2020.10.22 21:27:51]


   시작일        종료일               A

2018.04.01 ~ 2019.03.31    01년 00월 00일

2017.04.01 ~ 2018.03.31    01년 00월 00일

2013.11.01 ~ 2014.09.30    00년 11월 00일

2005.04.07 ~ 2007.03.13    01년 11월 07일

                        B          04년 10월 07일

A(기간별 근무일) 의 값과 B(기간별 근무일의 합)의 값을 구하려고 합니다

같은 직원이 근무와 퇴사를 반복하였을 때 재직증명서에서 표시하려고 합니다

퇴사기간의 근무까지 포함하여 계산하고 년/월/일로 구분하려니 잘 안되네요

어렵습니다 ㅠㅠ

by 샤랄라 [2020.10.23 18:11:00]
다른 분 쿼리 참조해서 만들어 보았어요~

with t(id, sdt, edt) as
(select 1, '2018.04.01', '2019.03.31' from dual union all
 select 1, '2017.04.01', '2018.03.31' from dual union all
 select 1, '2013.11.01', '2014.09.30' from dual union all
 select 1, '2005.04.07', '2007.03.13' from dual union all
 select 2, '2014.05.01', '2018.05.15' from dual union all
 select 2, '2012.02.07', '2013.03.13' from dual  
)
select id, sdt, edt
     , sum(yy) + case when sum(mm) > 12 then trunc(sum(mm)/12)
                      else 0 end as yy
     , case when sum(mm) > 12 then mod(sum(mm), 12) 
            else sum(mm) end as mm
     , sum(dd) as dd
from (select id, sdt, edt
           , trunc(months_between(edt, sdt)/12) yy
           , trunc(mod(months_between(edt, sdt), 12)) mm
           , greatest(edt - add_months(sdt, trunc(months_between(edt, sdt))), 0) dd
      from (select id
                 , to_date(sdt, 'yyyy.mm.dd') sdt
                 , to_date(edt, 'yyyy.mm.dd') + 1 edt
            from t
           )
     )
group by id, rollup ((sdt, edt))
order by id, edt desc nulls last
;

 

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