oracle

Oracle TIMESTAMP型の計算(XX秒後、XX日後)

TIMESTAMP型においてXX秒後、XX秒前、XX分後というのは少し面倒です。NUMTODSINTERVAL()ファンクションを使って計算します。

利用例
-- 1.45秒後
systimestamp + NUMTODSINTERVAL(1.45,'SECOND')
-- 2分前
systimestamp + NUMTODSINTERVAL(-2,'MINUTE')
-- 30時間後
systimestamp + NUMTODSINTERVAL(30,'HOUR')
-- 4日前
systimestamp + NUMTODSINTERVAL(-4,'DAY')
-- 5分21秒後
systimestamp + NUMTODSINTERVAL(60*5+21,'SECOND')
検証SQL
select '1.45秒後' memo,to_char(systimestamp,'YYYY/MM/DD HH24:MI:SS.ff6') now
,to_char(systimestamp + NUMTODSINTERVAL(1.45,'SECOND'),'YYYY/MM/DD HH24:MI:SS.ff6') elapsed
from dual union
select '2分前' memo,to_char(systimestamp,'YYYY/MM/DD HH24:MI:SS.ff6') now
,to_char(systimestamp + NUMTODSINTERVAL(-2,'MINUTE'),'YYYY/MM/DD HH24:MI:SS.ff6') elapsed
from dual union
select '30時間後' memo,to_char(systimestamp,'YYYY/MM/DD HH24:MI:SS.ff6') now
,to_char(systimestamp + NUMTODSINTERVAL(30,'HOUR'),'YYYY/MM/DD HH24:MI:SS.ff6') elapsed
from dual union
select '4日前' memo,to_char(systimestamp,'YYYY/MM/DD HH24:MI:SS.ff6') now
,to_char(systimestamp + NUMTODSINTERVAL(-4,'DAY'),'YYYY/MM/DD HH24:MI:SS.ff6') elapsed
from dual union
select '5分21秒後' memo,to_char(systimestamp,'YYYY/MM/DD HH24:MI:SS.ff6') now
,to_char(systimestamp + NUMTODSINTERVAL(60*5+21,'SECOND'),'YYYY/MM/DD HH24:MI:SS.ff6') elapsed
from dual
;
実効結果
MEMO       NOW                          ELAPSED
---------- ---------------------------- ----------------------------
1.45秒後   2022/07/02 17:05:46.278280   2022/07/02 17:05:47.728280
2分前      2022/07/02 17:05:46.278280   2022/07/02 17:03:46.278280
30時間後   2022/07/02 17:05:46.278280   2022/07/03 23:05:46.278280
4日前      2022/07/02 17:05:46.278280   2022/06/28 17:05:46.278280
5分21秒後  2022/07/02 17:05:46.278280   2022/07/02 17:11:07.278280

SQL>
SQL*Plus用
set lin 100
COLUMN memo FORMAT A10
COLUMN memo FORMAT A10
COLUMN now FORMAT A28
COLUMN elapsed FORMAT A28

TIMESTAMP型の引き算はこちらです

スポンサーリンク
コピペで使う