Когда вы вычитаете два значения 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
person
Ed Gibbs
schedule
13.01.2014