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