別の方法として、最初のタイムスタンプから秒 (または分と秒、または全体の時間部分) をintervalとして取得し、それを 2 番目のタイムスタンプに追加することもできます。
このTRUNC(date)
関数は、精度を決定するパラメーターを取ります。合格するとDD
(デフォルト)、時間全体が削除されます。合格するHH24
と、時間は保持されますが、分以下が削除されます。結果は日付ですが、タイムスタンプからそれを差し引くと、結果は次のようになります。間隔です(ドキュメントが言うように)。
このデモで作成された間隔を確認できます。
with t as (
select to_timestamp('2013-11-06 09:10:11', 'YYYY-MM-DD HH24:MI:SS') as ts1
from dual
)
select ts1,
ts1 - trunc(ts1, 'MI') as second_interval,
ts1 - trunc(ts1, 'HH24') as minute_interval,
ts1 - trunc(ts1, 'DD') as hour_interval
from t;
TS1 SECOND_INTERVAL MINUTE_INTERVAL HOUR_INTERVAL
----------------------- --------------- --------------- -------------
2013-11-06 09:10:11.000 0 0:0:11.0 0 0:10:11.0 0 9:10:11.0
次に、間隔を他のタイムスタンプに追加できます。
with t as (
select to_timestamp('2013-11-06 09:10:11', 'YYYY-MM-DD HH24:MI:SS') as ts1,
to_timestamp('2013-10-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS') as ts2
from dual
)
select ts2 + (ts1 - trunc(ts1, 'MI')) as ts2_second_adj,
ts2 + (ts1 - trunc(ts1, 'HH24')) as ts2_minute_adj,
ts2 + (ts1 - trunc(ts1, 'DD')) as ts2_hour_adj
from t;
TS2_SECOND_ADJ TS2_MINUTE_ADJ TS2_HOUR_ADJ
----------------------- ----------------------- -----------------------
2013-10-31 00:00:11.000 2013-10-31 00:10:11.000 2013-10-31 09:10:11.000
SQLフィドル。
時間の一部以上を取得している場合、これは複数のextract
呼び出しを行い、それらを正しい値 (秒の場合は 86400 など) で割るよりも少し簡単かもしれません。これにより、タイムスタンプの小数秒も保持されますが、これは望ましい場合とそうでない場合があります。
このアプローチは値にも機能しDATE
ますが、extract
バージョンには機能しません。