Contents
see List작성일 2015. 01. 05.
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;database
| No | 작성일 | Title |
|---|---|---|
| 2371 | 2026. 04. 08. | PostgreSQL 17 쿼리 최적화 완벽 가이드: 인덱스 전략, 실행 계획, 신규 기능 총정리 |
| 2356 | 2026. 04. 07. | PostgreSQL 17 MERGE 강화와 JSON_TABLE 실전 가이드 - SQL만으로 JSON 데이터 완벽 처리 |
| 2339 | 2026. 04. 06. | PostgreSQL 17 JSON_TABLE 완벽 가이드 - JSON 데이터를 테이블로 변환하는 최신 SQL 기법 |
| 2324 | 2026. 04. 05. | PostgreSQL 18 비동기 I/O와 UUIDv7, Virtual Generated Columns 실전 활용 |
| 2302 | 2026. 04. 05. | SQL 쿼리 최적화 실전 테크닉: EXPLAIN부터 인덱스 전략까지 |
| 2301 | 2026. 04. 05. | PostgreSQL 18 새 기능 총정리: 비동기 I/O부터 가상 열까지 |
| 2275 | 2026. 04. 04. | Redis 8.0 신기능과 실전 캐싱 전략: 검색, 벡터, 스트림 활용법 |
| 2274 | 2026. 04. 04. | PostgreSQL 17 신기능 완벽 가이드: JSON 쿼리, 병렬 처리, 논리 복제 강화 |
| 2191 | 2026. 02. 11. | 무중단 데이터베이스 마이그레이션 전략 |
| 2190 | 2026. 02. 11. | Redis 8.0 새로운 데이터 구조와 활용법 |