När du subtraherar två DATE
värden som enddate - startdate
du får skillnaden i dagar med decimal noggrannhet, så till exempel 1,5 skulle betyda 1 1/2 dag eller 36 timmar. Du kan konvertera det till HH:MI:SS
använder mycket matematik, men ett enklare sätt är att konvertera decimalvärdet till ett INTERVAL DAY TO SECOND
värde med NUMTODSINTERVAL
funktion:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Man skulle kunna tro TO_CHAR
funktionen skulle kunna formatera detta som HH:MI:SS
, men det verkar inte fungera så. Du kan använda EXTRACT
istället och TO_CHAR
för att se till att du får inledande nollor:
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')
00
en del av formatkoden anger två siffror, med en inledande nolla om det behövs. FM
del blir av med det inledande utrymmet i det formaterade resultatet, som reserveras för ett negativt tecken om det behövs.
Observera också att din fråga får samlade värden och använder dem i samma SELECT
lista. Oracle låter dig inte göra detta. Prova något liknande istället:
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