Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Finden Sie die verstrichene Zeit zwischen zwei Daten in Oracle SQL

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