当您减去两个DATE值(如enddate - startdate)时,您会得到小数精度的天数差,例如1.5意味着1 1/2天或36小时。您可以使用大量数学运算将其转换为HH:MI:SS,但更简单的方法是使用NUMTODSINTERVAL函数将十进制值转换为INTERVAL DAY TO SECOND值:
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
3条答案
按热度按时间lndjwyie1#
当您减去两个
DATE
值(如enddate - startdate
)时,您会得到小数精度的天数差,例如1.5意味着1 1/2天或36小时。您可以使用大量数学运算将其转换为HH:MI:SS
,但更简单的方法是使用NUMTODSINTERVAL
函数将十进制值转换为INTERVAL DAY TO SECOND
值:您可能会认为
TO_CHAR
函数能够将其格式化为HH:MI:SS
,但它似乎不是这样工作的。你可以使用EXTRACT
,和TO_CHAR
来确保你得到前导零:格式代码的
00
部分指定两个数字,如果需要,可以使用前导零。FM
部分去掉了格式化结果中的前导空间,如果需要,该空间将保留用于负号。还要注意,查询获取聚合值并在同一个
SELECT
列表中使用它们。甲骨文不会让你这么做的试试这样的方法:fhg3lkii2#
Oracle中的日期运算产生以天表示的数字。因此,要转换为小时,您将乘以24,然后
trunc
得到整数:要获取分钟数,请将days值转换为分钟数,并将
mod()
转换为60:对于秒,再次将天转换为秒,并将
mod()
转换为60:现在您可以将这些组合在一起以获得所需的字符串值。
7kqas0il3#
要获得秒内的差异,您可以使用以下命令