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 |
|---|---|---|
| 3380 | 2026. 08. 20. | PostgreSQL 느린 조회를 진단하는 방법: EXPLAIN ANALYZE와 복합 인덱스 실전 가이드 |
| 3348 | 2026. 08. 11. | PostgreSQL 잠금 대기 줄이기: 트랜잭션 범위와 lock_timeout 설정 실전 가이드 |
| 3316 | 2026. 08. 03. | PostgreSQL 백업 복구 실전 가이드: pg_dump·pg_restore로 장애 복구 절차 만들기 |
| 3284 | 2026. 07. 26. | PostgreSQL 인덱스가 있는데도 느린 쿼리 해결하기: EXPLAIN ANALYZE와 복합 인덱스 설계 |
| 3254 | 2026. 07. 18. | PostgreSQL 잠금 대기 진단 가이드: pg_stat_activity로 블로킹 쿼리 찾고 장애 줄이기 |
| 3202 | 2026. 07. 09. | PostgreSQL 백업 복구 검증 가이드: pg_dump와 psql로 실제 복원까지 확인하기 |
| 3170 | 2026. 07. 01. | MySQL 느린 쿼리 원인 찾기: EXPLAIN과 복합 인덱스 점검 가이드 |
| 3116 | 2026. 06. 23. | PostgreSQL 트랜잭션 충돌 줄이기: 잠금 순서와 짧은 재시도로 데드락 대응하기 |
| 3058 | 2026. 06. 15. | PostgreSQL JSONB 조회 튜닝: GIN 인덱스와 생성 컬럼으로 느린 검색 줄이기 |
| 2971 | 2026. 06. 07. | MySQL/MariaDB 복합 인덱스 설계: 느린 목록 조회를 줄이는 WHERE·ORDER BY 점검법 |