Когато извадите две DATE
стойности като enddate - startdate
получавате разликата в дни с десетична точност, така че например 1,5 би означавало 1 1/2 дни или 36 часа. Можете да го конвертирате в HH:MI:SS
използвайки много математика, но по-лесният начин е да преобразувате десетичната стойност в INTERVAL DAY TO SECOND
стойност с помощта на NUMTODSINTERVAL
функция:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Бихте си помислили, че TO_CHAR
функция ще може да форматира това като HH:MI:SS
, но изглежда не работи по този начин. Можете да използвате EXTRACT
вместо това и TO_CHAR
за да сте сигурни, че получавате водещи нули:
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
част от кода на формата определя две цифри, с водеща нула, ако е необходимо. FM
част се отървава от водещото място във форматирания резултат, което е запазено за отрицателен знак, ако е необходимо.
Също така имайте предвид, че вашата заявка получава обобщени стойности и ги използва в същия SELECT
списък. Oracle няма да ви позволи да направите това. Вместо това опитайте нещо подобно:
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