○ 테이블 스키마
create table diff_datetime ( start_datetime datetime, end_datetime datetime ) ;
○ 테스트 데이타
insert into diff_datetime ( start_datetime, end_datetime ) values (to_datetime('20160510053140','YYYYMMDDHH24MISS'), to_datetime('20160517165930', 'YYYYMMDDHH24MISS') ) ;
insert into diff_datetime ( start_datetime, end_datetime ) values (to_datetime('20160509000510','YYYYMMDDHH24MISS'), to_datetime('20160517090723', 'YYYYMMDDHH24MISS') ) ;
insert into diff_datetime ( start_datetime, end_datetime ) values (to_datetime('20160516011258','YYYYMMDDHH24MISS'), to_datetime('20160517203243', 'YYYYMMDDHH24MISS') ) ;
insert into diff_datetime ( start_datetime, end_datetime ) values (to_datetime('20160517011258','YYYYMMDDHH24MISS'), to_datetime('20160517203243', 'YYYYMMDDHH24MISS') ) ;
○ SQL
select
start_datetime
, end_datetime
, ( end_datetime - start_datetime ) / (1000 * 60 * 60* 24 ) || '일 '
|| TO_CHAR( TO_DATETIME ('00010101000000', 'YYYYMMDDHH24MISS' ) + ( end_datetime - start_datetime ), 'HH24:MI:SS' ) AS diff_time
from diff_datetime
○ SQL 실행결과
start_datetime end_datetime diff_time
====================================================================================
05:31:40.000 AM 05/10/2016 04:59:30.000 PM 05/17/2016 '7일 11:27:50'
12:05:10.000 AM 05/09/2016 09:07:23.000 AM 05/17/2016 '8일 09:02:13'
01:12:58.000 AM 05/16/2016 08:32:43.000 PM 05/17/2016 '1일 19:19:45'
01:12:58.000 AM 05/17/2016 08:32:43.000 PM 05/17/2016 '0일 19:19:45'
○ 설명
일 계산은 end_datetime에서 start_datetime을 차감하면 밀리세컨드 결과가 계산 된다.
1일은 1000 밀리세컨드 * 60초 * 60분 * 24시간임으로 ( end_datetime - start_datetime ) / (1000 * 60 * 60* 24 ) 으로 계산하면 된다.
참고로 예제 연산 처리순서가 나누기 연산이 더 빠르기 때문에 괄호를 사용하여 연산순서를 조정하였다.
시간 계산 부분은
TO_CHAR 함수의 날짜 포맷을 맞추기 위하여 TO_DATETIME ('00010101000000', 'YYYYMMDDHH24MISS' ) 를 사용하였다.
0001년 1월 1일에 end_datetime - start_datetime 결과를 더한 후에 시간을 추출하였다.
날짜 연산에 대한 출력을 "?일 ?시:?분:?초"로 출력 할 때는 유용한 방법이다.