2つのDATE
を引くと enddate - startdate
のような値 10進数の精度で日数の差が得られるため、たとえば1.5は1日半または36時間を意味します。これをHH:MI:SS
に変換できます 多くの数学を使用しますが、より簡単な方法は、10進値をINTERVAL DAY TO SECOND
に変換することです。 NUMTODSINTERVAL
を使用した値
機能:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
TO_CHAR
関数はこれをHH:MI:SS
としてフォーマットできます。 、しかしそれはそのように機能していないようです。 EXTRACT
を使用できます 代わりに、TO_CHAR
先行ゼロを確実に取得するには:
TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
|| ':' ||
TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
|| ':' ||
TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
00
フォーマットコードの一部は2桁を指定し、必要に応じて先行ゼロを付けます。 FM
パーツは、フォーマットされた結果の先頭のスペースを取り除きます。これは、必要に応じて負の符号用に予約されています。
また、クエリは集計値を取得し、それらを同じSELECT
で使用することにも注意してください。 リスト。オラクルはこれを許可しません。代わりに次のようなものを試してください:
WITH StartEndByID AS (
SELECT
msglog.id,
NUMTODSINTERVAL(max(msglog.timestamp) - min(msglog.timestamp), 'DAY') elapsed
FROM messagelog msglog
GROUP BY id
)
SELECT
id,
TO_CHAR(EXTRACT(HOUR FROM elapsed), 'FM00') || ':' ||
TO_CHAR(EXTRACT(MINUTE FROM elapsed), 'FM00') || ':' ||
TO_CHAR(EXTRACT(SECOND FROM elapsed), 'FM00') AS ElapsedHHMISS
FROM StartEndByID