【问题标题】:How to take differece between 2 dates of different format in SQL如何在 SQL 中获取不同格式的 2 个日期之间的差异
【发布时间】:2015-03-18 11:50:58
【问题描述】:

我有一个带有 LOAD_STRT_DTM 列的表。这是一个日期列,值是这样的 - 18-JUL-14 08.20.34.000000000 AM。

我想查找 5 天之前的数据。

我的逻辑是——

Select * from Table where 24 *(To_DATE(Sysdate,'DD-MM-YY') - To_DATE(LOAD_STRT_DTM,'DD-MM-YY')) >120

问题是——

Select (To_DATE(Sysdate,'DD-MM-YY') - To_DATE(LOAD_STRT_DTM,'DD-MM-YY')) from table 

这个查询应该给出两个日期之间的 NumberOfDays。但这不起作用,我怀疑,问题是因为 LOAD_STRT_DTM 列的格式。

请让我知道我在哪里做错了。

【问题讨论】:

  • 仅供参考,如果上述查询有效,它将为您提供超过 5 天的记录,而不是超过 5 天的记录(如您所说,“之前”)。

标签: sql oracle sql-date-functions


【解决方案1】:

如果您的列是 DATE 数据类型,一切正常,只需拍摄:

select * from table where LOAD_STRT_DTM > sysdate - 5;

无需将日期转换为 DATE 数据类型。

【讨论】:

    【解决方案2】:

    (To_DATE(Sysdate,'DD-MM-YY') - To_DATE(LOAD_STRT_DTM,'DD-MM-YY'))

    您不必再次将 DATE 转换为 DATE。它已经是一个日期。您只需将其用于日期计算。您使用 TO_DATESTRING 转换为 DATE

    例如,如果您有一个类似'18-JUL-14' 的字符串值,那么您需要使用TO_DATE 将其转换为日期。由于您的列是 DATE 数据类型,您只需按原样使用即可。

    这是一个日期列

    我想查找 5 天之前的数据。

    只需将过滤谓词用作:

    WHERE load_strt_dtm > SYSDATE - 5;
    

    注意:SYSDATE 有日期和时间元素,所以它也会根据时间进行过滤。如果您只想在过滤条件中使用日期部分,则可以使用 TRUNC。 IT 会截断时间元素。

    我已经回答了类似的问题,看看这个https://stackoverflow.com/a/29005418/3989608

    【讨论】:

    • 感谢您的解释,成功了。
    • 很高兴知道这一点。感谢您的反馈。如果对您有帮助,请将其标记为已回答。
    【解决方案3】:

    看起来LOAD_STRT_DTMTIMESTAMP 而不是DATE,考虑到秒后的小数点数。唯一需要注意的是,Oracle 会将DATE 隐式转换为TIMESTAMP,其中一个操作数是TIMESTAMP。所以解决办法

    WHERE load_strt_dtm > SYSDATE - 5
    

    会起作用;一样

    WHERE load_strt_dtm + 5 > SYSDATE
    

    但以下不会:

    WHERE SYSDATE - load_start_dtm < 5
    

    原因是TIMESTAMP 算术产生INTERVAL 而不是NUMBER

    【讨论】:

      【解决方案4】:

      首先将两个日期转换为相同格式 select datediff(dd,convert(varchar(20),'2015-01-01',112),convert(varchar(20),'01-10-2015',112) )

      【讨论】:

      • OP 正在寻找 Oracle 解决方案,而不是 SQL Server。
      猜你喜欢
      • 2018-02-16
      • 1970-01-01
      • 2020-08-21
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多