Oracle 월 간격(개월 수) 구하기

Oracle에서 두 날짜 사이의 개월 수를 계산하는 MONTHS_BETWEEN 함수와 다양한 날짜 연산 방법입니다.

1. MONTHS_BETWEEN 기본 사용

-- 두 날짜 사이 개월 수
SELECT MONTHS_BETWEEN(종료일, 시작일) FROM DUAL;

-- 예시
SELECT MONTHS_BETWEEN(
    TO_DATE("2024-06-15", "YYYY-MM-DD"),
    TO_DATE("2024-01-15", "YYYY-MM-DD")
) FROM DUAL;
-- 결과: 5

-- 같은 일자가 아니면 소수점 발생
SELECT MONTHS_BETWEEN(
    TO_DATE("2024-06-20", "YYYY-MM-DD"),
    TO_DATE("2024-01-15", "YYYY-MM-DD")
) FROM DUAL;
-- 결과: 5.16129...

2. 정수로 개월 수 구하기

-- 올림
SELECT CEIL(MONTHS_BETWEEN(종료일, 시작일)) FROM DUAL;

-- 내림
SELECT FLOOR(MONTHS_BETWEEN(종료일, 시작일)) FROM DUAL;

-- 반올림
SELECT ROUND(MONTHS_BETWEEN(종료일, 시작일)) FROM DUAL;

-- 절삭
SELECT TRUNC(MONTHS_BETWEEN(종료일, 시작일)) FROM DUAL;

3. 실전 예시

-- 회원 가입 후 경과 개월 수
SELECT 
    user_name,
    reg_date,
    TRUNC(MONTHS_BETWEEN(SYSDATE, reg_date)) AS 가입개월수
FROM tb_user;

-- 계약 잔여 개월 수
SELECT 
    contract_id,
    CEIL(MONTHS_BETWEEN(end_date, SYSDATE)) AS 잔여개월
FROM tb_contract
WHERE end_date > SYSDATE;

-- 개월 수에 따른 등급 분류
SELECT 
    user_name,
    CASE 
        WHEN MONTHS_BETWEEN(SYSDATE, reg_date) >= 24 THEN "VIP"
        WHEN MONTHS_BETWEEN(SYSDATE, reg_date) >= 12 THEN "골드"
        WHEN MONTHS_BETWEEN(SYSDATE, reg_date) >= 6 THEN "실버"
        ELSE "일반"
    END AS 등급
FROM tb_user;

4. 날짜 더하기/빼기

-- N개월 더하기
SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL;  -- 3개월 후

-- N개월 빼기
SELECT ADD_MONTHS(SYSDATE, -6) FROM DUAL; -- 6개월 전

-- 월 마지막 날
SELECT LAST_DAY(SYSDATE) FROM DUAL;

-- 다음 특정 요일
SELECT NEXT_DAY(SYSDATE, "월요일") FROM DUAL;

5. 년/월/일 단위 계산

-- 년수 계산
SELECT TRUNC(MONTHS_BETWEEN(종료일, 시작일) / 12) AS 년수 FROM DUAL;

-- 년, 월 분리
SELECT 
    TRUNC(MONTHS_BETWEEN(종료일, 시작일) / 12) AS 년,
    MOD(TRUNC(MONTHS_BETWEEN(종료일, 시작일)), 12) AS 월
FROM DUAL;

-- 일수 계산
SELECT 종료일 - 시작일 AS 일수 FROM DUAL;

6. 기간 표시 포맷

-- "N년 M개월" 형식
SELECT 
    TRUNC(MONTHS_BETWEEN(SYSDATE, reg_date) / 12) || "년 " ||
    MOD(TRUNC(MONTHS_BETWEEN(SYSDATE, reg_date)), 12) || "개월" AS 가입기간
FROM tb_user;

MONTHS_BETWEEN 주의사항

상황결과
같은 일자정수
다른 일자소수 (일수/31 추가)
둘 다 월말정수
시작일 > 종료일음수

7. 비즈니스 개월 수 (월 단위 계산)

-- 시작월과 종료월만 고려 (일 무시)
SELECT 
    (EXTRACT(YEAR FROM 종료일) - EXTRACT(YEAR FROM 시작일)) * 12 +
    (EXTRACT(MONTH FROM 종료일) - EXTRACT(MONTH FROM 시작일)) AS 월차이
FROM DUAL;