Wenn Sie zwei DATE
Werte wie enddate - startdate
subtrahieren, erhalten Sie die Differenz in Tagen mit dezimaler Genauigkeit, also zum Beispiel 1,5 würde 1 1/2 Tage oder 36 Stunden bedeuten. Sie können das zu HH:MI:SS
konvertieren eine Menge Mathematik verwenden, aber ein einfacher Weg ist, den Dezimalwert auf einen INTERVAL DAY TO SECOND
Wert mit der NUMTODSINTERVAL
Funktion zu konvertieren:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Man könnte meinen, die TO_CHAR
Funktion zur Formatierung der Lage wäre, dies als HH:MI:SS
, aber es scheint nicht so zu funktionieren. Sie können EXTRACT
stattdessen verwenden, 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
Teil des Formatcode gibt an zwei Stellen, mit einer führenden Null, wenn nötig. Der FM
-Teil löscht den führenden Platz im formatierten Ergebnis, das bei Bedarf für ein negatives Vorzeichen reserviert ist.
Beachten Sie auch, dass Ihre Abfrage Aggregatwerte erhält und in der gleichen SELECT
Liste verwendet. Oracle lässt dich das nicht tun. Versuchen Sie so etwas wie dieses stattdessen:
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
Danke für die upvote @GriffeyDog verwenden können, und ein sich selbst! Ihre Antwort wird auch gut funktionieren. Es kommt auf viele Mathe im Vergleich zu vielen Funktionsaufrufen, und ich erwarte, dass einige Leute mit viel Mathe wohler sein können. –