Contents
see ListOracle 월 간격(개월 수) 구하기
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;