Når du trækker to DATE
fra værdier som enddate - startdate
du får forskellen i dage med decimals nøjagtighed, så for eksempel 1,5 ville betyde 1 1/2 dag eller 36 timer. Du kan konvertere det til HH:MI:SS
bruger meget matematik, men en nemmere måde er at konvertere decimalværdien til en INTERVAL DAY TO SECOND
værdi ved hjælp af NUMTODSINTERVAL
funktion:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Du skulle tro, at TO_CHAR
funktion ville være i stand til at formatere dette som HH:MI:SS
, men det ser ikke ud til at virke sådan. Du kan bruge EXTRACT
i stedet og TO_CHAR
for at sikre, at du får indledende nuller:
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 af formatkoden angiver to cifre, med et indledende nul, hvis det er nødvendigt. FM
del slipper af med det førende mellemrum i det formaterede resultat, som er reserveret til et negativt fortegn, hvis det er nødvendigt.
Bemærk også, at din forespørgsel får samlede værdier og bruger dem i den samme SELECT
liste. Oracle vil ikke lade dig gøre dette. Prøv noget som dette i stedet:
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