あるタイムスタンプを別のタイムスタンプから減算すると、結果は内部間隔データ型になりますが、「間隔日から秒」として扱うことができます:
select
(localtimestamp - to_timestamp(us.STARTDATETIME,'hh24:mi:ss')) as HoursPassed
from random us;
HOURSPASSED
-------------------
+08 15:26:54.293892
'+08'(私のセッションタイムゾーン)は日数であり、UTCオフセットではありません。これは、文字列を日付またはタイムスタンプに変換し、時間部分のみを指定すると、日付部分がデフォルトで当月の初日に設定されるためです。
デフォルトの日付値は次のように決定されます。
- 年は、SYSDATEによって返される現在の年です。
- 月は、SYSDATEによって返される現在の月です。
- 日は01(月の最初の日)です。
- 時、分、秒はすべて0です。
これらのデフォルト値は、日付自体が指定されていない日付値を要求するクエリで使用されます...
だから私は本当に比較しています:
select localtimestamp, to_timestamp(us.STARTDATETIME,'hh24:mi:ss')
from random us;
LOCALTIMESTAMP TO_TIMESTAMP(US.STARTDATET
-------------------------- --------------------------
2017-08-09 23:26:54.293892 2017-08-01 08:00:00.000000
間隔を直接フォーマットすることはできませんが、時間の要素を抽出して個別にフォーマットし、それらを連結することはできます。
select to_char(extract(hour from (localtimestamp
- to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
||':'|| to_char(extract(minute from (localtimestamp
- to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
||':'|| to_char(extract(second from (localtimestamp
- to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
as hourspassed
from random us;
HOURSPASSED
-----------
15:26:54
同じ間隔を繰り返し計算するのは少し無駄で管理が難しいように見えるので、インラインビューまたはCTEで計算できます:
with cte (diff) as (
select localtimestamp - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss')
from random us
)
select to_char(extract(hour from diff), 'FM00')
||':'|| to_char(extract(minute from diff), 'FM00')
||':'|| to_char(extract(second from diff), 'FM00')
as hourspassed
from cte;
HOURSPASSED
-----------
15:26:54
タイムスタンプの代わりに日付を使用することもできます。減算すると、日数と小数日で差が数値として得られます。
select current_date - to_date(us.STARTDATETIME, 'hh24:mi') as hourspassed
from random us;
HOURSPASSED
-----------
8.64368056
フォーマットする最も簡単な方法は、既知の深夜時間に追加してから、to_char()
を使用することです。 :
select to_char(date '1970-01-01'
+ (current_date - to_date(us.STARTDATETIME, 'hh24:mi')),
'HH24:MI:SS') as hourspassed
from random us;
HOURSPAS
--------
15:26:54
current_date
を使い続けました localtimestamp
に最も近いものとして;実際にはsystimestamp
が必要な場合があります および/またはsysdate
。 (違いについてはこちらをご覧ください。)