【发布时间】:2021-09-10 20:39:44
【问题描述】:
我正在使用 plsql,我需要获取两个日期的时差,例如 x 天 y 小时 z 秒和 t 分钟。非常感谢任何帮助。
【问题讨论】:
我正在使用 plsql,我需要获取两个日期的时差,例如 x 天 y 小时 z 秒和 t 分钟。非常感谢任何帮助。
【问题讨论】:
根据两个date 值的datetime arithmetic matrix 差是一个number,即天数。作为一个纯数字,它没有时间成分。所以应该用numtodsinterval函数转换成interval day to second:
|间隔_ | | :---------------------------- | | +000000000 22:38:59.000000000 |with a as ( select sysdate as dt1, trunc(sysdate) as dt2 from dual ) select numtodsinterval(dt1 - dt2, 'DAY') as interval_ from a
db小提琴here
但是如果你有时间戳,那么根据相同的矩阵,默认情况下差异将是间隔:
|间隔_ | | :---------------------------- | | +000000000 22:38:59.000000000 |with a as ( select sysdate as dt1, trunc(sysdate) as dt2 from dual ) select numtodsinterval(dt1 - dt2, 'DAY') as interval_ from a
db小提琴here
请注意,to_char 函数中的时间间隔没有格式,因此要检索小时、分钟、秒,您需要使用 extract 函数
【讨论】:
(dt1 - dt2) DAY TO SECOND而不是使用NUMTODSINTERVAL,将数据类型显式设置为日期减法的间隔。
EXTRACT 函数可用于从间隔值表达式(即 2 个时间戳之间的差异返回的值)中获取日期时间字段。
WITH my_two_timestamps (ts1, ts2) AS
(
SELECT
TO_TIMESTAMP( '2021-05-08 12:04', 'yyyy-mm-dd hh24:mi' ),
TO_TIMESTAMP( '2022-06-21 20:22', 'yyyy-mm-dd hh24:mi' )
FROM DUAL
), ts_diff(diff) AS
(
SELECT ts2 - ts1 FROM my_two_timestamps
)
select extract( day from diff ) days,
extract( hour from diff ) hours,
extract( minute from diff ) minutes,
extract( second from diff ) seconds,
ROUND(extract( second from diff )) + extract( minute from diff )*60 + extract( hour from diff )*60*60 + extract( day from diff )*60*60*24 total_seconds
from ts_diff;
【讨论】: