Quando você subtrai dois
DATE
valores como enddate - startdate
você obtém a diferença em dias com precisão decimal, então, por exemplo, 1,5 significaria 1 1/2 dias ou 36 horas. Você pode converter isso para HH:MI:SS
usando muita matemática, mas uma maneira mais fácil é converter o valor decimal em um INTERVAL DAY TO SECOND
valor usando o NUMTODSINTERVAL
função: NUMTODSINTERVAL(enddate - startdate, 'DAY')
Você pensaria que o
TO_CHAR
função seria capaz de formatar isso como HH:MI:SS
, mas não parece funcionar dessa maneira. Você pode usar EXTRACT
em vez disso, e TO_CHAR
para garantir que você obtenha zeros à esquerda: 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')
O
00
parte do código de formato especifica dois dígitos, com um zero à esquerda, se necessário. O FM
parte se livra do espaço inicial no resultado formatado, que é reservado para um sinal negativo, se necessário. Observe também que sua consulta obtém valores agregados e os usa no mesmo
SELECT
Lista. A Oracle não vai deixar você fazer isso. Tente algo assim em vez disso: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