[Oracle] 두 날짜 개월 수 계산 방법 (MONTHS_BETWEEN)

오라클에서 두 날짜의 월 차이를 계산해서, 개월 수를 산출할 때는 MONTHS_BETWEEN 함수를 사용한다. 개월 수 계산은 나이, 근속일수를 계산할 때 자주 사용하며, 개월 수를 산출할 때는 함수의 첫 번째 인자의 날짜에서 두 번째 인자의 날짜를 빼는 방식으로 개월 수가 계산된다.

 

오라클 MONTHS_BETWEEN 함수

MONTHS_BETWEEN 함수의 첫 번째 인자의 날짜가 크면 양수의 값이 반환되고, 작으면 음수의 값이 반환된다. 상황에 맞게 날짜 인자의 순서를 바꿔서 입력하면 된다.

 

기본 사용법

SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2021-11-01', 'YYYY-MM-DD')) AS month_diff
  FROM dual

 

 

오늘 날짜(2022-01-19)와 비교 날짜(2021-11-01)의 개월 수 차이는 2.59.... 개월이다.

1개월 미만의 일수는 소수점으로 표시된다. 

 

개월 수 소수점 절사 (TRUNC)

SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE('2021-11-01','YYYY-MM-DD'))) AS month_diff
  FROM dual

 

 

실무에서 사용할 때는 소수점 아래는 TRUNC 함수를 사용하여 절사하고 실제 개월 수만 사용한다.

상황에 따라서 ROUND 함수를 사용하여 소수점을 반올림하여 사용할 수도 있다.

 

음수(-) 부호 제거 (ABS)

SELECT ABS(MONTHS_BETWEEN(TO_DATE('2021-11-01', 'YYYY-MM-DD'), SYSDATE)) AS month_diff
  FROM dual

 

 

MONTHS_BETWEEN(첫 번 재, 두 번째) 함수의 첫 번째 날짜가 작은 값인 경우 음수 개월 수가 반환되는데, ABS(절댓값) 함수를 사용하여 음수 부호를 제거할 수 있다.

 

활용 예제

만 나이 계산하기

SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('1989-12-03', 'YYYY-MM-DD')) / 12) AS age
  FROM dual

 

 

만 나이를 계산할 때 많이 사용한다.

 

근속 년, 월, 일 구하기

WITH emp AS (
  SELECT 7566 AS empno, 'JONES' AS ename, 'MANAGER' AS job, TO_DATE('1981-04-02', 'YYYY-MM-DD') AS hiredate FROM dual UNION ALL
  SELECT 7788 AS empno, 'SCOTT' AS ename, 'ANALYST' AS job, TO_DATE('1987-04-19', 'YYYY-MM-DD') AS hiredate FROM dual 
)

SELECT empno
     , ename
     , job
     , hiredate
     , TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate) / 12) AS "근속년"
     , TRUNC(MOD(MONTHS_BETWEEN(SYSDATE, hiredate) / 12, 1) * 12) AS "근속월"
     , TRUNC(MOD(MOD(MONTHS_BETWEEN(SYSDATE, hiredate) / 12, 1) * 12, 1) * (365 / 12)) AS "근속일"
  FROM emp

 

 

근속일수를 계산할 수 있다.

 

월만 카운트 하기 (하루라도 포함되어 있으면 1개월)

SELECT ROUND(MONTHS_BETWEEN( LAST_DAY(TO_DATE('2021-08-20', 'YYYY-MM-DD'))    
                           , TRUNC(TO_DATE('2021-07-20', 'YYYY-MM-DD'), 'MM') 
       )) AS month_diff
  FROM dual

 

 

해달 월에 하루라도 포함되어 있으면 1개월로 계산하는 방법이다. (해당 날짜의 일자는 무시)

 

MONTHS_BETWEEN 함수 개월 수 계산 원리

SELECT TO_DATE('2022-02-25', 'YYYY-MM-DD') 
         - TO_DATE('2022-01-28', 'YYYY-MM-DD') AS date_diff
     , MONTHS_BETWEEN( TO_DATE('2022-02-25', 'YYYY-MM-DD')
                     , TO_DATE('2022-01-28', 'YYYY-MM-DD')) AS month_diff
  FROM dual

 UNION ALL

SELECT TO_DATE('2022-02-28', 'YYYY-MM-DD') 
         - TO_DATE('2022-01-28', 'YYYY-MM-DD') AS date_diff
     , MONTHS_BETWEEN( TO_DATE('2022-02-28', 'YYYY-MM-DD')
                     , TO_DATE('2022-01-28', 'YYYY-MM-DD')) AS month_diff
  FROM dual

 

 

MONTHS_BETWEEN 함수를 자주 사용하지 않는 이유는 함수가 어떤 원리로 개월 수를 계산하는지 정확히 이해를 못 했기 때문일 수도 있다. 볼 때마다 헷갈리는 함수임에 틀림없다.

 

개월을 계산할 때는 두 번째 인자 월의 총일수만큼 이 1개월이라고 생각하면 된다.

1월은 총 31일 (1월 28일 → 2월 28일(31일) = 1개월)

 

 

두 번째 인자가 2월이기 때문에 28일 후 까지가 1개월이 된다. (2월 28일 → 3월 28일(28일) = 1개월)

(일수 계산은 당일은 제외하고 2월 29일~ 3월 28일 = 28일)

 

 

위의 2개의 예시를 하나로 합쳐서 개월 수를 계산하였다.

 

두 번째 인자의 날짜에서 시작해서 첫 번째 인자의 날짜 까지 위의 이미지처럼 계산된다.

1월 28일 → 2월 28일(31일) = 1개월

2월 28일 → 3월 28일(28일) = 1개월

 

 

위의 계산 공식과는 다르게 예외 케이스가 있다.

비교 날짜 모두 해당 월의 마지막 날짜인 경우 무조건 "1"을 반환한다.

 

 

[Oracle] 오라클 나이 계산 쿼리 (만나이, 한국나이, 신생아)

오라클에서 MONTHS_BETWEEN 함수를 사용하여 쉽게 나이를 계산 할 수 있다. 만나이 계산 방법을 많이 사용하며, 이것을 응용하여 한국나이를 계산할 수있다. 1세 미만의 나이는 개월수 또는 일수로

gent.tistory.com

 

[오라클] TRUNC 함수 사용방법 (시간, 소수점, 절사, 트렁크)

오라클(Oracle) TRUNC 함수 사용법 TRUNC 함수는 오라클의 아주 기본적인 함수이다. 단순 절사기능만 사용했다면 아래의 다양한 옵션을 익히면 조금 더 활용도를 높일 수 있다. TRUNC 함수 TRUNC 함수는

gent.tistory.com

 

댓글

Designed by JB FACTORY