我在Oracle DB中有一个名为Update_Date
的视图如果update_date等于昨天的日期(可能是当前日期-1),我需要从视图中选择所有字段。我试过了
select * from ack where update_date = SYSDATE - 1
但它没有返回任何数据。我在数据库中看到昨天的日期。
答案 0 :(得分:1)
您可能看不到任何数据,因为SYSDATE
和update_date
列都有时间组件(所有DATE
和TIMESTAMP
数据类型都有这个)但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)它是草率的代码,当用作某些功能的一部分时可能会产生意想不到的后果。