Cuando restas dos DATE
valores como enddate - startdate
obtiene la diferencia en días con precisión decimal, por lo que, por ejemplo, 1,5 significaría 1 1/2 días o 36 horas. Puedes convertir eso a HH:MI:SS
usando muchas matemáticas, pero una forma más fácil es convertir el valor decimal a un INTERVAL DAY TO SECOND
valor usando el NUMTODSINTERVAL
función:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Uno pensaría que el TO_CHAR
la función podría formatear esto como HH:MI:SS
, pero no parece funcionar de esa manera. Puedes usar EXTRACT
en su lugar, y TO_CHAR
para asegurarse de obtener ceros a la izquierda:
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')
El 00
parte del código de formato especifica dos dígitos, con un cero inicial si es necesario. La FM
parte se deshace del espacio inicial en el resultado formateado, que se reserva para un signo negativo si es necesario.
También tenga en cuenta que su consulta obtiene valores agregados y los usa en el mismo SELECT
lista. Oracle no te permitirá hacer esto. Prueba algo como esto en su lugar:
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