근속기간 구하는 질문입니다. 0 11 972

by HyunKee [Oracle 기초] 근속기간 [2020.07.28 09:45:57]


근속기간4.PNG (7,187Bytes)


SELECT 'D003' JEOPSU_NO, '20141101' SDT, '20181031' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20160301' SDT, '20190228' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20190901' SDT, '20191223' EDT FROM DUAL

 

접수번호가 D003 인 사람의 근무 기간 입니다. 윤년 까지 생각하려니 쿼리짜는데 막막하네요..

원하는 결과 값은 사진과 같습니다
오라클 고수님들 많은 답변 부탁드려요 ㅠ

 

++ 추가  각각의 기간에 해당하는 직업이 있습니다. 최대한 간단하게 만든 데이터 입니다.

by 우리집아찌 [2020.07.28 10:17:38]
-- 날짜가 틀리네요 ㅡㅡ
WITH T AS (
SELECT 'D003' JEOPSU_NO, '20141101' SDT, '20181031' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20160301' SDT, '20190228' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20190901' SDT, '20191223' EDT FROM DUAL
) 

SELECT TRUNC(TOT_DT / 12 )      AS YY
     , TRUNC(MOD(TOT_DT , 12 )) AS  MM
     , ( TOT_DT  - TRUNC(TOT_DT) ) * (365/12)
  FROM (SELECT JEOPSU_NO
             , SUM(MONTHS_BETWEEN ( TO_DATE(EDT) , TO_DATE(SDT))) TOT_DT
          FROM T
         GROUP BY JEOPSU_NO
      ) 
      
  

 


by 우리집아찌 [2020.07.28 10:19:01]

다시 보니까 날짜가 중첩되네요?


by HyunKee [2020.07.28 10:42:41]

답변 감사합니다.

추가의 써놓은 글처럼 각각의 기간에는 해당하는 직무가 있습니다.
++ 날짜는 제가 임의로 넣어놓은 것은 아니고 실제 가지고 있는 데이터입니다..

SELECT 'D003' JEOPSU_NO, '보조연구원' JOB,'20141101' SDT, '20181031' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '조교' JOB, '20160301' SDT, '20190228' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '강사' JOB, '20190901' SDT, '20191223' EDT FROM DUAL

날짜는 어디가 틀렸는지 말씀해주실수 있을까요?


by 우리집아찌 [2020.07.28 12:27:08]
-- 결과만 맞췄어요.
WITH T AS (
SELECT 'D003' JEOPSU_NO, '20141101' SDT, '20181031' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20160301' SDT, '20190228' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20190901' SDT, '20191223' EDT FROM DUAL
) 
 
SELECT TRUNC(TOT_DT / 12 )      AS YY
     , TRUNC(MOD(TOT_DT , 12 )) AS  MM
     , ROUND(( TOT_DT  - TRUNC(TOT_DT) ) * (365/12)) DD
  FROM (SELECT JEOPSU_NO
             , SUM(MONTHS_BETWEEN ( TO_DATE(EDT) + 1 , TO_DATE(SDT)  )) TOT_DT
          FROM T
         GROUP BY JEOPSU_NO
      ) 

 


by HyunKee [2020.07.28 14:08:37]

답변 감사합니다.

다른 데이터를 돌려봐도 원하는 결과 값이 나오네요 ! 감사합니다.

좋은 하루 보내세요 !


by 마농 [2020.07.28 14:46:49]

TO_DATE(edt) 이 구문은 잠재적 오류 가능성을 가진 구문입니다.
다음과 같이 변경하셔야 합니다.
TO_DATE(edt, 'yyyymmdd')


by 우리집아찌 [2020.07.28 15:01:54]

이게 남의것은 잘보이는데.. 제가 짠건 안보이네요. ^^


by HyunKee [2020.07.28 17:15:48]
WITH T AS (
SELECT 'D003' JEOPSU_NO, '20141101' SDT, '20181031' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20160301' SDT, '20190228' EDT FROM DUAL UNION ALL
SELECT 'D003' JEOPSU_NO, '20190901' SDT, '20191223' EDT FROM DUAL
) 
  
SELECT TRUNC(TOT_DT / 12 )      AS YY
     , TRUNC(MOD(TOT_DT , 12 )) AS  MM
     , ROUND(( TOT_DT  - TRUNC(TOT_DT) ) * (365/12)) DD
  FROM (SELECT JEOPSU_NO
             , SUM(MONTHS_BETWEEN ( TO_DATE(EDT,'YYYYMMDD') + 1 , TO_DATE(SDT,'YYYYMMDD')  )) TOT_DT
          FROM T
         GROUP BY JEOPSU_NO
      )

아찌님, 마농님 답변 감사합니다 ! 좋은 하루 보내세요 !


by 마농 [2020.07.28 11:34:03]

months_between 으로 기간 구할 때 edt + 1 을 해줘야 정확하게 나옵니다.
그리고 기간이 중복되는 부분에 대한 처리 방침을 정하셔야 합니다.
중복되는 그대로 계산할지? 중복 제거하고 계산할지?


by 우리집아찌 [2020.07.28 12:15:46]

앗.. 그렇군요..


by HyunKee [2020.07.28 14:00:10]

답변 감사합니다.

기간이 중복되는 부분에 대한 처리는 중복 제거 하지 않고 그대로 계산해야 할 것 같습니다.

 

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