0

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

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

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

怎么会?提前致谢。

对不起,我忘了提到 DUE_DATE 是类型Date

4

2 回答 2

5

您需要截断日期,如

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) 上添加基于函数的索引,在这种情况下,两者的性能都可能同样好。

分享和享受。

于 2012-08-10T16:28:53.233 回答
0

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

于 2012-08-10T16:32:10.670 回答