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