날짜문제입니다...개월 구하는 문제.. 0 4 5,147

by 손님 날짜 개월 [2008.09.29 15:22:43]


예시 :

2005-04-05~2008-05-31  ->  개월수를 구하는데요.. (단 15일이상 근무시 1개월입니다.)

ex) 1년 2월 15일 -> 15개월입니다.

 

문 1 : 2005-04-05~2008-05-31 개월수 구하는 방법을 갈켜주세요..

select months_between('2008-05-31', '2005-04-05') from dual;

맞나요?  그걸로 해봤는데 답이 37.8387096774194 가 나오는데요..

답은 38개월인가요? 39개월인가요?

 

by xo [2008.09.29 15:51:36]
15일이상 근무시 1개월이라고 했으니
37.8... 은 38개월입니다.
1이 1개월이니 0.5이상은 15일 이상이지요.

by 마농 [2008.09.29 16:03:20]
ROUND(MONTHS_BETWEEN(to_ymd, from_ymd))

by 질문자 [2008.09.29 16:48:18]
댓글을 달아주셔서 감사합니다.

질문이 있는데요..

1년 2월 15일 이라면 2007-01-01~2008-02-15 맞나요?
그걸 쿼리로 해서 13이라고 나왔는데요.. 왜 15개월인가요? 좀 헷갈리네요..

1. 2007-01-01~2007-12-31 -> 쿼리로 하면 12라고 나오고요.
2. 2007-01-01~2008-01-31 -> 쿼리로 하면 13라고 나오고요.
3. 2007-01-01~2008-02-29 -> 쿼리로 하면 14라고 나오고요.
4. 2007-01-01~2008-02-15 -> 쿼리로 하면 14라고 나와야하는데 13라고 나왔는데요.. -_-

by 마농 [2008.09.29 17:39:59]
month_between 함수는 08/1/1 ~ 08/12/31 을 12달로 보지 않습니다.
08/1/1 ~ 09/1/1을 정확하게 12달로 봅니다.
여기에서 하루 차이가 나구요.
각 달마다 28, 29, 30, 31 일로 일수가 다르고 윤달도 있고 해서 정확한 기간 계산이 힘듭니다.
그래서 기간 계산 함수들은 각각 자신만의 루규칙을 가지고 계산을 하구요.
그 규칙마다 장단점을 가지고 있습니다. 헛점이 있다는 것이지요.
기본적으로 제공되는 months_between 함수가
08/01/31 ~ 08/02/29(윤달) 를 정확하게 1달로 계산하는 장점이 있지만
08/01/29 ~ 08/02/29 도 정확하게 1달이 나오며
08/01/30 ~ 08/02/29 은 불행하게도 1달을 못채운 것으로 나옵니다.
정확한 기간 계산은 힘듭니다.
오류를 최대한 줄일수 있는 규칙을 정하고 그에 따라 계산하는 방법밖에 없을 듯 합니다.
아래는 제가 나름 정한 규칙대로 작성한 쿼리입니다.
1. 일단 months_between 의 달수를 소수점 이하를 버린다. mm
2. 이렇게 구한 달수를 시작일에 add_months 한후 종료일과의 차이를 다시 구한다. dd
3. dd 값의 오류 보정 0보다 작은 값이 나올 수도 있음, 0으로 처리
SELECT TRUNC(MONTHS_BETWEEN(edt+1, sdt)) mm
, GREATEST(edt - ADD_MONTHS(sdt, TRUNC(MONTHS_BETWEEN(edt+1, sdt))) + 1, 0) dd
, TRUNC(MONTHS_BETWEEN(edt+1, sdt))
+ CASE WHEN edt - ADD_MONTHS(sdt, TRUNC(MONTHS_BETWEEN(edt+1, sdt))) + 1 >= 15
THEN 1 ELSE 0 END AS gigan
FROM
(
SELECT TO_DATE('20070101','yyyymmdd') sdt
, TO_DATE('20080215','yyyymmdd') edt
FROM dual
)
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입