如何在where子句中使用当前日期

时间:2017-01-24 13:44:51

标签: sql oracle

我在Oracle DB中有一个名为Update_Date

的视图

enter image description here

如果update_date等于昨天的日期(可能是当前日期-1),我需要从视图中选择所有字段。我试过了

select * from ack where update_date = SYSDATE - 1

但它没有返回任何数据。我在数据库中看到昨天的日期。

3 个答案:

答案 0 :(得分:1)

您可能看不到任何数据,因为SYSDATEupdate_date列都有时间组件(所有DATETIMESTAMP数据类型都有这个)但IDE是您的正在使用的只是选择不向您展示。至change this behaviour in SQL Developer see here

这将使用您在update_date列上的任何索引:

SELECT *
FROM   ack
WHERE  update_date >= TRUNC( SYSDATE ) - INTERVAL '1' DAY
AND    update_date <  TRUNC( SYSDATE );

这将在TRUNC( update_date)上使用基于函数的索引,但不会在update_date列上使用索引:

SELECT *
FROM   ack
WHERE  TRUNC( update_date ) = TRUNC( SYSDATE ) - INTERVAL '1' DAY;

答案 1 :(得分:0)

尝试:

select * from ack where trunc(update_date) = trunc(SYSDATE - 1)

您发布的内容是如何呈现日期,它们可能还包含小时和分钟等部分。 trunc会缩短精确度。请执行:

select to_char(update_date,'dd-mon-yyyy hh24:mi:ss') update_date, sysdate - 1 as curr_date from ack;

您正在比较这些值并且它们不相同。这就是为什么你没有得到任何结果。

答案 2 :(得分:-1)

我喜欢&CURRENT_TIMESTAMP&#39;结束&#39; SYSDATE&#39; - 两者都应该做同样的事情,但可读性还有很长的路要走。

我建议您投放&#39; UPDATE_DATE&#39;到DATE(如果是在datetime中)然后使用CAST和DATEADD来调整现在&#39;到了昨天&#39;

WHERE 
    CAST( update_date AS DATE) = CAST( DATEADD(day,-1,current_timestamp) AS DATE)

编辑:请不要使用(日期1)它是草率的代码,当用作某些功能的一部分时可能会产生意想不到的后果。