Wenn Sie zwei DATE
subtrahieren Werte wie enddate - startdate
Sie erhalten die Differenz in Tagen mit Dezimalgenauigkeit, also würde beispielsweise 1,5 1 1/2 Tage oder 36 Stunden bedeuten. Sie können das in HH:MI:SS
umwandeln mit viel Mathematik, aber einfacher ist es, den Dezimalwert in ein INTERVAL DAY TO SECOND
umzuwandeln -Wert mithilfe von NUMTODSINTERVAL
Funktion:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Sie würden den TO_CHAR
denken Funktion könnte dies als HH:MI:SS
formatieren , aber es scheint nicht so zu funktionieren. Sie können EXTRACT
verwenden stattdessen und TO_CHAR
um sicherzustellen, dass Sie führende Nullen erhalten:
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')
Der 00
Ein Teil des Formatcodes gibt zwei Ziffern an, gegebenenfalls mit einer führenden Null. Der FM
part beseitigt das führende Leerzeichen im formatierten Ergebnis, das bei Bedarf für ein negatives Vorzeichen reserviert ist.
Beachten Sie auch, dass Ihre Abfrage aggregierte Werte erhält und sie in demselben SELECT
verwendet aufführen. Oracle lässt Sie das nicht zu. Versuchen Sie es stattdessen so:
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