Když odečtete dvě DATE
hodnoty jako enddate - startdate
dostanete rozdíl ve dnech s desetinnou přesností, takže například 1,5 by znamenalo 1 1/2 dne nebo 36 hodin. Můžete to převést na HH:MI:SS
používá hodně matematiky, ale jednodušší způsob je převést desetinnou hodnotu na INTERVAL DAY TO SECOND
hodnotu pomocí NUMTODSINTERVAL
funkce:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Mysleli byste si, že TO_CHAR
funkce by to dokázala naformátovat jako HH:MI:SS
, ale zdá se, že to tak nefunguje. Můžete použít EXTRACT
místo toho a TO_CHAR
abyste se ujistili, že dostanete úvodní nuly:
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
část kódu formátu určuje dvě číslice, v případě potřeby s úvodní nulou. FM
část se zbaví úvodní mezery ve formátovaném výsledku, která je v případě potřeby vyhrazena pro záporné znaménko.
Všimněte si také, že váš dotaz získává agregované hodnoty a používá je ve stejném SELECT
seznam. Oracle vám to nedovolí. Zkuste místo toho něco takového:
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