[Oracle] 두 날짜 개월 수 계산 방법 (MONTHS_BETWEEN)
- 데이터베이스/오라클
- 2022. 1. 20.
오라클에서 두 날짜의 월 차이를 계산해서, 개월 수를 산출할 때는 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"을 반환한다.