oracle

TIMESTAMP型の引き算で経過時間を表示する

DATE型と異なり経過時間を秒で表現するにはひと手間(EXTRACTファンクション)かけて導出する事になります。

検証SQL
select c1
,to_char(x.ELAPSED) as 経過日時分秒
,EXTRACT(SECOND FROM elapsed) 
 + EXTRACT(MINUTE FROM elapsed) * 60
 + EXTRACT(HOUR FROM elapsed)   * 3600
 + EXTRACT(DAY FROM elapsed)    * 86400 as 経過秒
,trunc((
   EXTRACT(SECOND FROM elapsed)
 + EXTRACT(MINUTE FROM elapsed) * 60
 + EXTRACT(HOUR FROM elapsed)   * 3600
 + EXTRACT(DAY FROM elapsed)    * 86400)/60,3) as 経過分
 from
(
 select c1,c3-c2 elapsed
 from ex102
) x
order by c1
;
実効結果
        C1 経過日時分秒                           経過秒         経過分
---------- ------------------------------ -------------- --------------
         1 +000000000 00:00:01.450000              1.450          0.024
         2 +000000000 00:02:00.000000            120.000          2.000
         3 +000000001 06:00:00.000000         108000.000       1800.000
         4 +000000004 00:00:00.000000         345600.000       5760.000
         5 +000000000 00:05:21.000000            321.000          5.350

SQL>
SQL*Plus用
set lin 100
COLUMN "経過日時分秒" FORMAT A30
COLUMN "経過秒" FORMAT 999999990.999
COLUMN "経過分" FORMAT 999999990.999
検証用データ

検証用データは以下の通り作成しました

create table ex102
(
 c1 number
,c2 timestamp
,c3 timestamp
);
-- 1.45秒後
insert into ex102(c1,c2,c3) values (1,systimestamp,systimestamp + NUMTODSINTERVAL(1.45,'SECOND'));
-- 2分後
insert into ex102(c1,c2,c3) values (2,systimestamp,systimestamp + NUMTODSINTERVAL(2,'MINUTE'));
-- 30時間後
insert into ex102(c1,c2,c3) values (3,systimestamp,systimestamp + NUMTODSINTERVAL(30,'HOUR'));
-- 4日後
insert into ex102(c1,c2,c3) values (4,systimestamp,systimestamp + NUMTODSINTERVAL(4,'DAY'));
-- 5分21秒後
insert into ex102(c1,c2,c3) values (5,systimestamp,systimestamp + NUMTODSINTERVAL(60*5+21,'SECOND'));
commit;

xx秒後、xx秒前を計算するにはNUMTODSINTERVAL()を使います

スポンサーリンク