在oracle sql中查找两个日期之间经过的时间

mfpqipee  于 2023-06-05  发布在  Oracle
关注(0)|答案(3)|浏览(227)

我需要找到格式为hh:mm:ss的时间之间的差异

select msglog.id,max(msglog.timestamp) enddate,
   min(msglog.timestamp) startdate,
   enddate - startdate
   from MESSAGELOG msglog
   group by id

在上面的查询中,msglog.timestamp的类型是DATE。
如何在oracle中以正确的格式获得经过的时间或时间之间的差异?

lndjwyie

lndjwyie1#

当您减去两个DATE值(如enddate - startdate)时,您会得到小数精度的天数差,例如1.5意味着1 1/2天或36小时。您可以使用大量数学运算将其转换为HH:MI:SS,但更简单的方法是使用NUMTODSINTERVAL函数将十进制值转换为INTERVAL DAY TO SECOND值:

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列表中使用它们。甲骨文不会让你这么做的试试这样的方法:

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
fhg3lkii

fhg3lkii2#

Oracle中的日期运算产生以天表示的数字。因此,要转换为小时,您将乘以24,然后trunc得到整数:

trunc(24 * (enddate - startdate))

要获取分钟数,请将days值转换为分钟数,并将mod()转换为60:

mod(trunc(24 * 60 * (enddate - startdate)), 60)

对于秒,再次将天转换为秒,并将mod()转换为60:

mod(trunc(24 * 60 * 60 * (enddate - startdate)), 60)

现在您可以将这些组合在一起以获得所需的字符串值。

7kqas0il

7kqas0il3#

要获得秒内的差异,您可以使用以下命令

select round(24 * 60 * 60* (TO_DATE('2017/02/17 9:32:25', 'YYYY/MM/DD HH:MI:SS') - TO_DATE('2017/02/17 8:30:30', 'YYYY/MM/DD HH:MI:SS'))) from dual;

相关问题