【问题标题】:How to get Time Differences of Two Dates like x days y hours z seconds t minutes [duplicate]如何获得两个日期的时差,例如 x 天 y 小时 z 秒 t 分钟 [重复]
【发布时间】:2021-09-10 20:39:44
【问题描述】:

我正在使用 plsql,我需要获取两个日期的时差,例如 x 天 y 小时 z 秒和 t 分钟。非常感谢任何帮助。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    根据两个date 值的datetime arithmetic matrix 差是一个number,即天数。作为一个纯数字,它没有时间成分。所以应该用numtodsinterval函数转换成interval day to second

    with a as (
      select
        sysdate as dt1,
        trunc(sysdate) as dt2
      from dual
    )
    select
      numtodsinterval(dt1 - dt2, 'DAY') as interval_
    from a
    
    |间隔_ | | :---------------------------- | | +000000000 22:38:59.000000000 |

    db小提琴here

    但是如果你有时间戳,那么根据相同的矩阵,默认情况下差异将是间隔:

    with a as (
      select
        sysdate as dt1,
        trunc(sysdate) as dt2
      from dual
    )
    select
      numtodsinterval(dt1 - dt2, 'DAY') as interval_
    from a
    
    |间隔_ | | :---------------------------- | | +000000000 22:38:59.000000000 |

    db小提琴here

    请注意,to_char 函数中的时间间隔没有格式,因此要检索小时、分钟、秒,您需要使用 extract 函数

    【讨论】:

    • 您也可以使用(dt1 - dt2) DAY TO SECOND而不是使用NUMTODSINTERVAL,将数据类型显式设置为日期减法的间隔。
    【解决方案2】:

    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;
    

    【讨论】:

    • 如果我在表格的两列中有两个日期怎么办?请帮忙。
    • 我的 cte 有 2 列。如果您需要更多详细信息,请使用可重现的示例更新您的问题。
    • 另一个答案显示了如何从两个日期获取 INTERVAL DAY TO SECOND 类型值。您可以减去两个日期列并使用 numtodsinterval 。然后要提取天、小时、分钟、秒,您可以使用此答案中的提取语法。
    猜你喜欢
    • 2023-03-31
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多