在Oracle视图上使用BETWEEN进行DATE查询

时间:2018-11-19 09:45:38

标签: oracle

当我执行此查询时,我在oracle视图中使用'between'运算符进行日期参数查询时遇到了问题:

SELECT * 
FROM MY_VIEW 
WHERE STATUS = 'Active' 
AND CHECKER_DATE BETWEEN to_date(sysdate - 1, 'DD-MON-YY') AND to_date(sysdate, 'DD-MON-YY');

它没有给我记录(准确地说,那天我有任何记录)。

我尝试使用'in'运算符,但仍然不给我记录。

请为此提供一些信息。

* checker_date定义为日期

3 个答案:

答案 0 :(得分:3)

您的第一个错误是对已经为DATE的值调用to_date()。 to_date()期望使用VARCHAR值,因此sysdate将首先转换为VARCHAR,然后立即转换回其开始的DATE值。

您可能想要

AND CHECKER_DATE BETWEEN trunc(sysdate) - 1 AND trunc(sysdate)

这很可能仍然无法满足您的需求,因为包括“ today”中的行。 trunc(sysdate)的意思是“今天是午夜”,今天午夜之后创建的任何行都将不包括在内。使用日期/时间值(尽管名称,Oracle的DATE类型的确包含时间),最好不要使用BETWEEN,而应使用显式范围运算符:

AND CHECKER_DATE >= trunc(sysdate) - 1 
AND CHECKER_DATE < trunc(sysdate) + 1

trunc(sysdate) + 1是明天的午夜,因此任何(严格地)小于“今天”的值。


以上所有假设CHECKER_DATE被定义为DATETIMESTAMP

答案 1 :(得分:0)

您可以尝试:

SELECT * 
FROM MY_VIEW 
WHERE STATUS = 'Active' 
AND CHECKER_DATE BETWEEN trunc(sysdate - 1) AND trunc(sysdate);

Oracle建议不要使用to_date作为日期。因为Trunc删除了时间分量,所以这里也出现了trunc。

答案 2 :(得分:0)

可能是记录不是'Active'或'Active',如果有引用表中的一个,则该值不存在,并且trunc(sysdate -1)和trunc(sysdate)会帮助