총 근무일을 년월일로... 0 5 2,313

by 암소핫 [SQL Query] [2011.10.05 22:30:04]


안녕하세요. 언제나 사이트에서 많은 정보를 알아 가고 있는 사람입니다.

이것저것 해보다가 답이 안나와서 질문을 드립니다...

총 근무일이 예를 들어 724일 이면 1년 11개월 29일 이렇게 출력되기를 원합니다.

현재는 저렇게 출력까지 했는 데

725일이면 1년 12월 이렇게 표기가 됩니다.

726일이면 1년 12월 1일 이렇게 표기가 되고

730일이면 2년 만 나오게 되어 있습니다.

이유는 1달의 기준을 30일로 나누다보니

1년은 365일 인데 5일이 빠진 경우가 발생 해서 그렇습니다.

밑에는 제가 년월일을 구했던 방법입니다.

-- 년 구하기
SELECT TRUNC(725/ 365) FROM DUAL
-- 월 구하기
SELECT TRUNC(MOD(725, 365) / 30) FROM DUAL
-- 일 구하기
SELECT ROUND(MOD(MOD(725, 365), 30)) FROM DUAL

위에서 725는 총 근무일수입니다.

30일로 나눈다는 게 어떻게 보면 잘못된 건지만 더 이상 어떻게 진행해야 되는지
고민해봐도 답이 잘 안나오네요..;;;

쿼리로 하다가 도무지 답이 안나와  FUNCTION으로 처리한건데
고수님들의 가르침 부탁드립니다.

좋은 하루 되시길 바랍니다^^

by 허재영 [2011.10.06 09:06:02]
5일이 빠진 경우를 위 프로젝트 진행팀과 상의 해서 해결하는게 맞는것 같습니다. sql을 모르시는게 아니고 기준이 없는게 문제 인것 같습니다. 달력이라는게 큰달, 작은달, 윤년 때문에 기준이 있어야 합니다. 근무일로 안되면 근무시작일, 근무종료일로 구해 보시는것도 좋을듯 합니다.

by 문두 [2011.10.06 09:49:54]
SELECT (SUBSTR(DD, 1, 4) - 1) || '년 '
|| (SUBSTR(DD, 5, 2) - 1) || '월 '
|| (SUBSTR(DD, 7, 2) - 1) || '일'
FROM (
SELECT TO_CHAR(TO_DATE('00010101', 'YYYYMMDD') + 725, 'YYYYMMDD') AS DD
FROM DUAL
) A

이렇게하면 혹시 안될까요??

by 문두 [2011.10.06 09:54:03]
근데 요렇게하면 윤달같은게 포함되버리네요

by 문두 [2011.10.06 10:02:31]
WITH TEMP AS
(
SELECT 725 AS DD
FROM DUAL
)
SELECT FLOOR(A.DD / 365) || '년 '
|| TO_CHAR(ADD_MONTHS(TO_DATE('00010101', 'YYYYMMDD') + MOD(A.DD , 365), -1), 'MM') || '월 '
|| TO_CHAR(TO_DATE('00010101', 'YYYYMMDD') + MOD(A.DD , 365) -1, 'DD') || '일'
FROM TEMP A

by 암소핫 [2011.10.06 22:24:38]
문두님 제시한 방법이 가장 좋을 뜻 하네요. 많은 답변 감사합니다^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입