오라클 MONTHS_BETWEEN 관련하여 고수님들께 문의드립니다 0 2 9,899

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

고수님들께 검증 및 더 좋은 제안을 부탁드립니다.

감사합니다!

by 마농 [2024.09.13 09:59:58]

원래 months_between 은 날짜를 그대로 넣으면 안되고
만료일+1 을 하던지 시작일-1 을 하던지 해서 넣어야 합니다.
그리고 월말이 낀 경우 계산에 오차가 발생할 가능성은 존재합니다.

- 수정전 : MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD'), TO_DATE(신규일,'YYYYMMDD')
- 수정후 : MONTHS_BETWEEN(TO_DATE(만기일,'YYYYMMDD')+1, TO_DATE(신규일,'YYYYMMDD')


by 우주민 [2024.09.13 10:58:27]
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)

인 경우로 보여집니다.

이럴경우 신규일의 일자를 해당 날의 말일로 변경해서 처리하는 방법으로 처리해보았습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입