오라클에서 날짜 연산의 결과는 NUMBER형태의 일(DAY) 단위로 나옵니다.
단순히 날짜끼리만 빼면 두 날짜 사이의 일수가 나오는거죠
그걸 다시 년으로, 월로, 일로, 시간으로, 분으로, 초로.. 변형을 해야합니다.
TO_CHAR(날짜-날짜, 'YYYYMMDD HH24MISS')를 하게되면 중간의 날짜-날짜의 결과가 NUMBER로 나타나기때문에 에러가 발생합니다..
그래서 여러 함수를 이용해서 변형을 해줘야 합니다.
사용한 함수는 아래와 같습니다.
MONTHS_BETWEEN이라는 함수는 두 날짜 사이의 개월수를 리턴해줍니다.
MOD는 나머지를 리턴해줍니다
TRUNC는 지정한 자리수이하는 잘라내기
ROUND는 지정한 자리수만이하 반올림하기
FLOOR는 지정한 자리수 이하 올림하기
TO_DATE는 지정된 형식으로 DATE형으로 변환하기
SELECT
TRUNC(MONTHS_BETWEEN(종료날짜, 시작날짜)/12) "년",
TRUNC(MOD(MONTHS_BETWEEN(종료날짜, 시작날짜),12)) "개월",
FLOOR(MOD(MONTHS_BETWEEN(종료날짜, 시작날짜),1)*30.5) "일",
TRUNC(MOD(종료날짜-시작날짜,1)*24) "시간",
TRUNC(MOD((종료날짜-시작날짜)*24,1)*60) "분",
TRUNC(ROUND(MOD((종료날짜-시작날짜)*24*60,1)*60)) "초"
FROM DUAL;
조금 복잡해 보일 수 있지만 천천히 보시면 이해하실 수 있을것입니다.
"년"은 두 날짜사이의 개월 차이를 구해 12로 나눕니다
"월"은 12로 나눈 나머지의 숫자를 구합니다
"일"은 월을 뺀 나머지의 소숫점이하 값에 날짜에 평균월수를 30.5라고 가정하고 곱해준 후 올림합니다
"시간"은 두 날짜사이의 값을 뺀 결과인 일(DAY)의 소수점 자리를 24로 곱해줍니다
"분"은 두 날짜사의의 값을 뺀 결과에 24를 곱한 후 나머지 소수점 자리를 60으로 곱해줍니다
"초"는 두 날짜사의의 값을 뺀 결과에 24*60를 곱한 후 나머지 소수점 자리를 60으로 곱해준 후 반올림 합니다
출처 : http://rahxephon.tistory.com/1408