当我执行此查询时,我在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定义为日期
答案 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
被定义为DATE
或TIMESTAMP
答案 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)会帮助