날짜관련 질문입니다. 0 3 1,539

by 무지버기 [SQL Query] [2017.12.11 12:50:40]



MONTHS_BETWEEN 함수를 이용해서 두 일자의 개월 수를 구할려고 합니다.

SELECT MONTHS_BETWEEN(TO_DATE('20160229','yyyymmdd'), TO_DATE('20160131','yyyymmdd')) FROM DUAL UNION ALL
SELECT MONTHS_BETWEEN(TO_DATE('20160229','yyyymmdd'), TO_DATE('20160130','yyyymmdd')) FROM DUAL UNION ALL
SELECT MONTHS_BETWEEN(TO_DATE('20160229','yyyymmdd'), TO_DATE('20160129','yyyymmdd')) FROM DUAL

위 쿼리의 결과값은

---------------------------------------------------------------

1

0.96774

1

두 번째의 결과값도 1개월을 얻고자 합니다.

좋은 방법이 있을까요?

 

by 고수가되고싶어요 [2017.12.11 13:29:59]
SELECT MONTHS_BETWEEN(TO_DATE('20160229','yyyymmdd'), TO_DATE('20160131','yyyymmdd')) FROM DUAL UNION ALL
SELECT ROUND(MONTHS_BETWEEN(TO_DATE('20160229','yyyymmdd'), TO_DATE('20160130','yyyymmdd'))) FROM DUAL UNION ALL
SELECT MONTHS_BETWEEN(TO_DATE('20160229','yyyymmdd'), TO_DATE('20160129','yyyymmdd')) FROM DUAL

이러케요???


by 무지버기 [2017.12.11 13:51:49]

아니요.

알고 있는 날짜를 올림해서 1개월을 얻고자 하는건 아니구요.

두 일자는 어떤 날짜가 들어올지 모르지만

2월말과 비교할려는 상대 날짜가 1월29일,30일이 되었을때 1개월의 차이를

얻고자 합니다.


by 마농 [2017.12.11 14:33:56]
WITH t AS
(
SELECT '20160131' sdt, '20160229' edt FROM dual
UNION ALL SELECT '20160130', '20160229' FROM dual
UNION ALL SELECT '20160129', '20160229' FROM dual
UNION ALL SELECT '20160229', '20160329' FROM dual
UNION ALL SELECT '20160229', '20160330' FROM dual
UNION ALL SELECT '20160229', '20160331' FROM dual
UNION ALL SELECT '20160330', '20160430' FROM dual
UNION ALL SELECT '20160331', '20160430' FROM dual
)
SELECT sdt, edt
     , CASE WHEN e = LAST_DAY(e) AND TO_CHAR(s, 'dd') > TO_CHAR(e, 'dd')
            THEN ROUND(MONTHS_BETWEEN(e, s))
            ELSE MONTHS_BETWEEN(e, s)
             END m
  FROM (SELECT sdt, edt
             , TO_DATE(sdt, 'yyyymmdd') s
             , TO_DATE(edt, 'yyyymmdd') e
          FROM t
        )
;

 

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