Wanneer u twee DATE
. aftrekt waarden zoals enddate - startdate
je krijgt het verschil in dagen met decimale nauwkeurigheid, dus bijvoorbeeld 1,5 zou 1 1/2 dag of 36 uur betekenen. Je kunt dat converteren naar HH:MI:SS
met veel wiskunde, maar een eenvoudigere manier is om de decimale waarde om te zetten in een INTERVAL DAY TO SECOND
waarde met behulp van de NUMTODSINTERVAL
functie:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Je zou denken dat de TO_CHAR
functie zou dit kunnen formatteren als HH:MI:SS
, maar zo lijkt het niet te werken. U kunt EXTRACT
. gebruiken in plaats daarvan, en TO_CHAR
om ervoor te zorgen dat u voorloopnullen krijgt:
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')
De 00
een deel van de formaatcode specificeert twee cijfers, indien nodig met een voorloopnul. De FM
part verwijdert de leidende spatie in het opgemaakte resultaat, die indien nodig is gereserveerd voor een minteken.
Houd er ook rekening mee dat uw zoekopdracht geaggregeerde waarden krijgt en deze gebruikt in dezelfde SELECT
lijst. Oracle laat je dit niet doen. Probeer in plaats daarvan iets als dit:
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