MONTHS_BETWEEN
두 날짜의 월 차이를 계산해서, 개월 수를 산출할 때는 MONTHS_BETWEEN 함수를 사용하며 함수의 첫 번째 인자의 날짜에서 두 번째 인자의 날짜를 빼는 방식으로 개월 수가 계산된다.
MONTHS_BETWEEN의 예시
SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2021/11/01', 'YYYY/MM/DD')) AS MONTH
FROM DUAL
/*
SYSDATE = 2022-01-19
TO_DATE = 2021-11-01
MONTHS_BETWEEN = (2022/01/19) - (2021/11/01) = 2.5개월
*/
1. 소수점 절사(TRUNC)
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE('2021-11-01','YYYY-MM-DD'))) AS MONTH
FROM DUAL
-- TRUNC를 사용하였기에 2.597.... 에서 소수점을 절사한 2만 나타남.
2. 소수점 버림(FLOOR)
SELECT FLOOR(MONTHS_BETWEEN(SYSDATE,TO_DATE('2021-11-01','YYYY-MM-DD'))) AS MONTH
FROM DUAL
-- FLOOR을 사용하였기에 2.597.... 에서 소수점을 버린 2만 나타남.
변형 문제
-- SSN_1 = 570211
-- SSN_2 = 101112
-- SYSDATE = 20221017
select FLOOR(
MONTHS_BETWEEN(SYSDATE, TO_DATE(
CASE WHEN SUBSTR(SSN_1 || SSN_2,7,1) IN ('1','2','5','6') THEN '19'
WHEN SUBSTR(SSN_1 || SSN_2,7,1) IN ('3','4','7','8') THEN '20'
WHEN SUBSTR(SSN_1 || SSN_2,7,1) IN ('9','0') THEN '18' END
|| SUBSTR(SSN_1 || SSN_2,1,6) ,'YYYYMMDD'))
/12)
|| '세' AS AGE
FROM DUAL
/*
먼저 CASE WHEN에 SUBSTR의 값을 찾고 조건인 IN안에 해당 값이 있는지 찾는다.
(여기서는 SSN_1과 SSN_2를 합쳐 570211101112가 나왔고 7번째의 1개의 번호는 1이기에 '19'가 된다.)
다음으로 TO_DATE의 값이 나왔다면 MONTHS_BETWEEN을 통해 값을 찾고 찾은 값에 12를 나눠준다.
('19'의 값과 '570211' 값을 합쳐 '19570211'의 값을 나타내고 SYSDATE의 값과 '19570211'을 빼준다.
그렇게 되면 총 788.6이라는 숫자가 나오는데 788개월 6일이라는 뜻으로 여기서 1년인 12개월을 빼주면
'65.71666666666667' 이라는 숫자가 나온다.)
마지막으로 FLOOR을 사용해서 소수점 숫자를 버려주고 '세'를 붙여주면 '65세' 라는 현재 나이가
출력된다.
*/