2014/05/02

[MSSQL] 근무일 수 구하기

[출처] http://www.sqler.com/83649

SELECT CASE WHEN SUBSTRING(ENTER_DT,5,2) > SUBSTRING(Z.RETIRE_DT,5,2)
            THEN DATEDIFF(YY, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM) - 1 
            ELSE DATEDIFF(YY, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM) 
       END AS 년
     , CASE WHEN RIGHT(ENTER_DT,2) > RIGHT(Z.RETIRE_DT,2)
            THEN DATEDIFF(M, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM)%12 - 1 
            ELSE DATEDIFF(M, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM)%12 
       END AS 개월
     , CASE WHEN RIGHT(ENTER_DT,2) > RIGHT(Z.RETIRE_DT,2)
            THEN DATEDIFF(D,CONVERT(CHAR(6),DATEADD(M,-1, Z.RETIRE_DTM),112)+RIGHT(ENTER_DT,2), Z.RETIRE_DTM)+1
            ELSE DATEDIFF(D,CONVERT(CHAR(6),DATEADD(M,0, Z.RETIRE_DTM),112)+RIGHT(ENTER_DT,2), Z.RETIRE_DTM)+1
       END AS 일
  FROM (
        SELECT '20100708' AS ENTER_DT
             , '20120301' AS RETIRE_DT
             , CONVERT(DATETIME, '20120301') AS RETIRE_DTM
       ) Z

결과 : 1년 7개월 23일

* 퇴사일이 20120308 이면
결과는 1년 8개월 1일

* 일자(마지막 2자리)에 따라 개월 수와 일 수가 계산됨(일 수가 무조건 양수로 표현되도록 함)

댓글 2개:

  1. SELECT CASE WHEN SUBSTRING(ENTER_DT,5,2) > SUBSTRING(Z.RETIRE_DT,5,2)
    THEN DATEDIFF(YY, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM) - 1
    ELSE DATEDIFF(YY, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM)
    END AS 년
    , CASE WHEN RIGHT(ENTER_DT,2) > RIGHT(Z.RETIRE_DT,2)
    THEN DATEDIFF(M, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM)%12 - 1
    ELSE DATEDIFF(M, CONVERT(DATETIME, ENTER_DT), Z.RETIRE_DTM)%12
    END AS 개월
    , CASE WHEN RIGHT(ENTER_DT,2) > RIGHT(Z.RETIRE_DT,2)
    THEN DATEDIFF(D,CONVERT(CHAR(6),DATEADD(M,-1, Z.RETIRE_DTM),112)+RIGHT(ENTER_DT,2), Z.RETIRE_DTM)+1
    ELSE DATEDIFF(D,CONVERT(CHAR(6),DATEADD(M,0, Z.RETIRE_DTM),112)+RIGHT(ENTER_DT,2), Z.RETIRE_DTM)+1
    END AS 일
    FROM (
    SELECT '20160516' AS ENTER_DT
    , '20190510' AS RETIRE_DT
    , CONVERT(DATETIME, '20190510') AS RETIRE_DTM
    ) Z

    결과: 3년 -1개월 25일

    답글삭제
    답글
    1. CASE WHEN CONVERT(int,CONVERT(varchar(10),DATEADD(YEAR, DATEDIFF(year, START_DATE, END_DATE), START_DATE),112)) > CONVERT(int, REPLACE(END_DATE, '-', ''))
      THEN DATEDIFF(year, START_DATE, END_DATE) -1
      ELSE DATEDIFF(year, START_DATE, END_DATE)
      END AS EXPYEAR,
      CASE WHEN CONVERT(int,CONVERT(varchar(10), DATEADD(MONTH, DATEDIFF(month, START_DATE, END_DATE), START_DATE),112)) > CONVERT(int, REPLACE(END_DATE, '-', ''))
      THEN DATEDIFF(month, START_DATE, END_DATE) % 12 - 1
      ELSE DATEDIFF(month, START_DATE, END_DATE) % 12
      END AS EXPMON,
      CASE WHEN (CONVERT(int, SUBSTRING(END_DATE, 9,2)) - CONVERT(int,SUBSTRING(START_DATE, 9,2))) > 0
      THEN CONVERT(int, SUBSTRING(END_DATE, 9,2)) - CONVERT(int,SUBSTRING(START_DATE, 9,2))
      ELSE CONVERT(int, SUBSTRING(END_DATE, 9,2)) - CONVERT(int,SUBSTRING(START_DATE, 9,2)) + 31

      전 이 글 보고 이렇게 작성했어요
      도움 많이 됐습니다...
      너무 어렵네요

      삭제