민법 160조 역에 의한 계산 방법으로 경력계산할때 쓰는 방법인데..
도저히 어떻게 해야할지 몰라 이렇게 글을 올립니다.
혹, 쿼리로 짜신분이나 경험 있으신분 도움좀 부탁드립니다.
* 기간을 주(週), 월(月,) 또는 년(年)으로 정한 때에는 曆에 의하여 계산한다.
* 주(週), 월(月) 또는 년(年)의 처음으로부터 기간을 기산(起算)하지 아니한 때 에는 최후의 주(週), 월(月), 또는 년(年)에서 그 기산일(起算日)에 해당한 날의 전일(前日)로 기간이 만료한다.
* 월(月) 또는 년(年)으로 정(定)한 경우에 최종의 월(月)에 해당일이 없는 때에는 그 월(月)의 말일(末日)로 기간이 만료한다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | WITH t AS ( SELECT '20130201' sdt, '20130228' edt FROM dual UNION ALL SELECT '20130201' , '20130605' FROM dual UNION ALL SELECT '20130201' , '20140315' FROM dual UNION ALL SELECT '20130201' , '20140530' FROM dual ) , t1 AS ( SELECT TO_DATE(sdt, 'yyyymmdd' ) sdt , TO_DATE(edt, 'yyyymmdd' ) edt FROM t ) SELECT sdt, edt -- 1. 주차(00주 0일) , FLOOR((edt - sdt + 1) / 7) ww , MOD(edt - sdt + 1, 7) wd -- 2. 월차(00월 00일) , FLOOR(MONTHS_BETWEEN(edt+1, sdt)) m1 , edt - ADD_MONTHS(sdt, FLOOR(MONTHS_BETWEEN(edt+1, sdt))) + 1 m2 -- 3. 연차(00년 00월 00일) , FLOOR(MONTHS_BETWEEN(edt+1, sdt)/12) y1 , MOD(FLOOR(MONTHS_BETWEEN(edt+1, sdt)),12) y2 , edt - ADD_MONTHS(sdt, FLOOR(MONTHS_BETWEEN(edt+1, sdt))) + 1 y3 -- 4. 월 최대일을 30일로 보는 경우 30일은 29일로 표시 , LEAST(edt - ADD_MONTHS(sdt, FLOOR(MONTHS_BETWEEN(edt+1, sdt))) + 1, 29) y4 FROM t1 ; |