17강. 날짜 차이 및 월 단위 계산하기 (MONTHS_BETWEEN, ADD_MONTHS)
SQL에서는 날짜 데이터를 다룰 때 두 날짜 간 개월 수를 계산하거나 특정 개월 수를 더하거나 빼는 기능이 자주 필요합니다.
이때 활용하는 함수가 MONTHS_BETWEEN 과 ADD_MONTHS 입니다.
✅ 1. MONTHS_BETWEEN 함수란?
MONTHS_BETWEEN(날짜1, 날짜2) 함수는 두 날짜 간 개월 수 차이를 반환합니다.
- 날짜1: 비교 기준이 되는 날짜
- 날짜2: 빼려는 날짜
- 결과값: 날짜1 - 날짜2의 개월 수 차이를 소수점 포함하여 반환
📌 MONTHS_BETWEEN 기본 예제
SELECT MONTHS_BETWEEN(TO_DATE('2024-06-01', 'YYYY-MM-DD'),
TO_DATE('2024-03-01', 'YYYY-MM-DD')) AS result
FROM dual;
📌 실행 결과
설명: 2024-06-01과 2024-03-01의 차이는 3개월이므로 3이 반환됩니다.
📌 일 단위 차이가 있는 경우
SELECT MONTHS_BETWEEN(TO_DATE('2024-06-15', 'YYYY-MM-DD'),
TO_DATE('2024-03-01', 'YYYY-MM-DD')) AS result
FROM dual;
📌 실행 결과
설명: 3.4833은 3개월 + 14일(0.4833개월) 을 의미합니다.
→ MONTHS_BETWEEN은 일 단위 차이까지 소수점으로 계산합니다.
✅ 2. ADD_MONTHS 함수란?
ADD_MONTHS(날짜, 개월 수) 함수는 특정 날짜에 개월 수를 더하거나 뺀 날짜를 반환합니다.
- 날짜: 기준이 되는 날짜
- 개월 수: 더하거나 뺄 개월 수 (음수 입력 시 개월 수 감소)
📌 ADD_MONTHS 기본 예제
SELECT ADD_MONTHS(TO_DATE('2024-03-01', 'YYYY-MM-DD'), 3) AS new_date
FROM dual;
📌 실행 결과

설명: 2024-03-01에서 3개월 후인 2024-06-01이 반환됩니다.
📌 개월 수를 빼는 경우
SELECT ADD_MONTHS(TO_DATE('2024-03-01', 'YYYY-MM-DD'), -3) AS new_date
FROM dual;
📌 실행 결과

설명: -3을 입력하면 3개월 전인 2023-12-01이 반환됩니다.
📌 월의 마지막 날일 때 처리 방식
ADD_MONTHS를 사용하면 말일 처리도 가능합니다.
SELECT ADD_MONTHS(TO_DATE('2024-01-31', 'YYYY-MM-DD'), 1) AS new_date
FROM dual;
📌 실행 결과

설명: 1월 31일에서 1개월 추가하면 2월 29일(윤년 기준) 로 자동 조정됩니다.
→ ADD_MONTHS는 말일을 자동 조정하여 반환합니다.
✅ 3. MONTHS_BETWEEN & ADD_MONTHS 활용 사례
(1) 특정 고객의 가입 후 경과 개월 수 계산
고객이 가입한 날짜로부터 현재까지 몇 개월이 지났는지 계산할 수 있습니다.
SELECT customer_id, name,
MONTHS_BETWEEN(SYSDATE, join_date) AS months_since_join
FROM customers;
설명: SYSDATE를 사용하여 현재 날짜 기준으로 가입한 지 몇 개월이 지났는지 계산합니다.
→ 이를 통해 VIP 고객 선정, 혜택 제공, 계약 갱신 일정 관리 등을 할 수 있습니다.
(2) 특정 날짜로부터 계약 만료일 계산
예를 들어, 1년(12개월) 계약을 연장한 만료일을 계산하고 싶다면?
SELECT contract_id, customer_id,
ADD_MONTHS(contract_start_date, 12) AS contract_end_date
FROM contracts;
설명: ADD_MONTHS(계약 시작일, 12)을 사용하여 1년 뒤 만료일을 계산합니다.
→ 이를 활용하면 자동 갱신, 연장 만료일 설정 등을 쉽게 할 수 있습니다.
(3) 특정 월에 만기가 도래하는 계약 조회
예를 들어, 6개월 이내에 만료되는 계약을 조회하고 싶다면?
SELECT contract_id, customer_id, contract_end_date
FROM contracts
WHERE contract_end_date <= ADD_MONTHS(SYSDATE, 6);
설명: ADD_MONTHS(SYSDATE, 6)은 현재 날짜로부터 6개월 후의 날짜를 의미합니다.
→ WHERE contract_end_date <= 조건을 사용하면 6개월 이내에 만료되는 계약만 조회할 수 있습니다.
✅ 4. 정리
✅ MONTHS_BETWEEN(날짜1, 날짜2) → 날짜1과 날짜2의 개월 차이를 소수점 포함하여 반환
✅ ADD_MONTHS(날짜, 개월 수) → 특정 날짜에 개월 수를 더하거나 빼서 새로운 날짜 반환
✅ 가입 후 경과 개월 수 계산, 계약 만료일 계산, 특정 월에 만기 도래 계약 조회 등에 활용 가능