by Viper [SQL Query] 오라클 MONTHS_BETWEEN 개월 [2024.09.12 19:28:07]
안녕하세요~
오라클 쿼리로,
계좌번호가, 신규일~만기일 가입개월 수 6개월 이상인 계좌만 추출하는 쿼리를 만들다가 골때리는 케이스가 생겼습니다. 신규일이 20240830 이고 만기가 20250228인 경우, 6개월짜리 가입기간인데 실제 MONTHS_BETWEEN으로 계산해보면 5.9일이 나옵니다.
그래서 해결해 봤습니다.
/*
1.신규일의 일자가 28보다 작을때는 비정상 개월수계산이 없어서
MONTHS_BETWEEN으로 그대로 계산
2.나머지 데이터 중, 신규일의 일자가 만기일의 일자보다 작거나 같아도 비정상 개월수계산이 없어서
MONTHS_BETWEEN으로 그대로 계산
3. 나머진 비정상이 나오므로, 올림으로 처리
*/
SELECT *
FROM 계좌명세
WHERE
CASE WHEN SUBSTR(신규일,7,2) NOT IN ('28','29','30','31')
THEN MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD'),TO_DATE(신규일,'YYYYMMDD'))
ELSE CASE WHEN SUBSTR(신규일,7,2) <= SUBSTR(만기일,7,2)
THEN MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD'),TO_DATE(신규일,'YYYYMMDD'))
ELSE CEIL(MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD'),TO_DATE(신규일,'YYYYMMDD')))
END
END >= 6
고수님들께 검증 및 더 좋은 제안을 부탁드립니다.
감사합니다!
원래 months_between 은 날짜를 그대로 넣으면 안되고
만료일+1 을 하던지 시작일-1 을 하던지 해서 넣어야 합니다.
그리고 월말이 낀 경우 계산에 오차가 발생할 가능성은 존재합니다.
- 수정전 : MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD'), TO_DATE(신규일,'YYYYMMDD')
- 수정후 : MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD')+1, TO_DATE(신규일,'YYYYMMDD')
SELECT *
FROM 계좌명세
WHERE
, CASE WHEN TO_DATE(만기일,'YYYYMMDD') = LAST_DAY(TO_DATE(만기일,'YYYYMMDD'))
AND SUBSTR(만기일,7,2) < SUBSTR(신규일,7,2)
THEN MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD'),LAST_DAY(TO_DATE(신규일,'YYYYMMDD')))
ELSE MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD'),TO_DATE(신규일,'YYYYMMDD'))
END >= 6
이 문제가 생성되는 경우는
- 만기일이 말일 & 신규일이 말일 아님 & 만기일(DAY) < 신규일(DAY)
인 경우로 보여집니다.
이럴경우 신규일의 일자를 해당 날의 말일로 변경해서 처리하는 방법으로 처리해보았습니다.