【问题标题】:Oracle CURRENT_DATE doesn't work in queryOracle CURRENT_DATE 在查询中不起作用
【发布时间】:2012-08-10 16:24:21
【问题描述】:

我有一个简单的查询来过滤出due_date 的值是今天。

SELECT *
  FROM ORDER
  WHERE DUE_DATE = CURRENT_DATE AND
        ROWNUM <= 10
  ORDER BY DUE_DATE ASC

但是,即使我有一堆订单的截止日期为今天,查询实际上返回 0 行。

怎么会?提前致谢。

抱歉,我忘记提及 DUE_DATE 的类型为 Date

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您需要截断日期,如

    SELECT *
      FROM ORDER
      WHERE TRUNC(DUE_DATE) = TRUNC(CURRENT_DATE) AND
            ROWNUM <= 10
      ORDER BY DUE_DATE ASC 
    

    或使用范围比较,如

    SELECT *
      FROM ORDER
      WHERE DUE_DATE BETWEEN TRUNC(CURRENT_DATE)
                         AND TRUNC(CURRENT_DATE) + INTERVAL '1' DAY - INTERVAL '1' SECOND AND
            ROWNUM <= 10
      ORDER BY DUE_DATE ASC 
    

    后一个示例可能会执行得更好,因为可以使用索引(假设您在 DUE_DATE 有索引)。当然,您也可以在 TRUNC(DUE_DATE) 上添加基于函数的索引,在这种情况下,两者的性能都可能一样好。

    分享和享受。

    【讨论】:

      【解决方案2】:

      CURRENT_DATE 包含月、日和年。您的截止日期也可能包含小时、分钟、秒。如果是这样,您应该在进行比较时截断日期。

      【讨论】:

      • 如果您执行SELECT CURRENT_DATE FROM DUAL,您会注意到CURRENT_DATE 还包括小时、分钟和秒。
      • 是的,基本上你需要在相同的数据表示中比较日期。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多