Oracle
 sql >> Database >  >> RDS >> Oracle

trova il tempo trascorso tra due date in Oracle sql

Quando sottrai due DATE valori come enddate - startdate ottieni la differenza in giorni con precisione decimale, quindi ad esempio 1,5 significherebbe 1 1/2 giorni o 36 ore. Puoi convertirlo in HH:MI:SS usando molta matematica, ma un modo più semplice è convertire il valore decimale in un INTERVAL DAY TO SECOND valore utilizzando NUMTODSINTERVAL funzione:

  NUMTODSINTERVAL(enddate - startdate, 'DAY')

Penseresti il ​​TO_CHAR la funzione sarebbe in grado di formattarlo come HH:MI:SS , ma non sembra funzionare in questo modo. Puoi usare EXTRACT invece, e TO_CHAR per assicurarti di ottenere zeri iniziali:

 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')

Il 00 parte del codice del formato specifica due cifre, con uno zero iniziale se necessario. Il FM parte elimina lo spazio iniziale nel risultato formattato, che è riservato per un segno negativo, se necessario.

Tieni inoltre presente che la tua query ottiene valori aggregati e li utilizza nello stesso SELECT elenco. Oracle non ti permette di farlo. Prova invece qualcosa del genere:

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