【问题标题】:Compare date + time with timestamp将日期 + 时间与时间戳进行比较
【发布时间】:2013-11-11 16:10:33
【问题描述】:

我有一个包含两个时间列的表。首先(名称为 DATE)存储日期(不包括时间部分),因此数据类型为 DATE。第二列(名称为 TIME)用于以秒为单位存储时间,因此数据类型为 NUMBER。

我需要将这两个日期与另一个表中的时间戳进行比较。如何计算两列(DATE 和 TIME)的日期并与另一个表的时间戳进行比较?

我尝试计算时间列之外的小时数并将其添加到日期列中,但输出似乎不正确:

SELECT to_date(date + (time/3600), 'dd-mm-yy hh24:mi:ss') FROM mytable;

输出只是日期,而不是时间部分。

【问题讨论】:

  • 您可以选择 mins(date) 并进行比较,也可以使用 DATETIME,其格式为:YYYY-MM-DD HH:MM:SS

标签: sql oracle


【解决方案1】:

您可以使用INTERVAL DAY TO SECOND 类型:

SELECT your_date + NUMTODSINTERVAL(your_time_in_seconds, 'SECOND') FROM dual;

例子:

SELECT TRUNC(SYSDATE) + NUMTODSINTERVAL(39687, 'SECOND') FROM dual;

计算出的日期与时间为:10-11-2013 11:01:27

在我看来,这比将您的值除以 3600 更好,因为您有一个以秒为单位的间隔,因此使用间隔来表示您的时间感觉很自然,然后可以轻松地将其添加到 DATE 列中数据类型。

Oracle Interval in Documentation

NUMTODSINTERVAL Function in documentation

【讨论】:

    【解决方案2】:

    date + (time/3600)is already a DATE,所以你不需要做to_date()。它确实有你添加的时间部分,你只是没有显示它。如果您想以您显示的格式将其输出为字符串,请改用to_char()

    SELECT to_char(date + (time/3600), 'dd-mm-yy hh24:mi:ss') FROM mytable;
    

    ...除了如果time 实际上以秒为单位,您需要除以 86400 (24x60x60),而不是 3600。目前您依赖于客户的默认日期格式,可能是 NLS_DATE_FORMAT,它不会t 包括您所说的时间部分。这并不意味着时间不存在,只是没有显示。

    但这只是为了展示。将其保留为日期,只需添加两个值,与您的时间戳进行比较时,例如

    WHERE date + (time/86400) < systimestamp
    

    【讨论】:

      【解决方案3】:

      这样试试,

       SELECT TO_DATE('11/11/2013','dd/mm/yyyy') + 3600/60/60/24 FROM DUAL;
      

      您的查询,

      SELECT date + time/60/60/24 FROM mytable;
      

      【讨论】:

        【解决方案4】:

        尝试使用 to_timestamp 而不是 to_date

        【讨论】:

        • DATE 类型具有时间组件,因此使用时间戳不一定有帮助;虽然我想确保在时间戳之间进行比较可能很有用。
        猜你喜欢
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 2020-04-22
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        相关资源
        最近更新 更多