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
고수님들께 검증 및 더 좋은 제안을 부탁드립니다.
감사합니다!
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)
인 경우로 보여집니다.
이럴경우 신규일의 일자를 해당 날의 말일로 변경해서 처리하는 방법으로 처리해보았습니다.