当我执行以下查询时,我在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定义为日期
您的第一个错误是对一个已经是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
您可以尝试:
SELECT *
FROM MY_VIEW
WHERE STATUS = 'Active'
AND CHECKER_DATE BETWEEN trunc(sysdate - 1) AND trunc(sysdate);
Oracle建议不要使用to_date作为日期。这里还有trunc,因为trunc删除了时间组件。
可能是记录不是"活动"或"活动",如果有,则在其中一个引用表中不存在值,trunc(sysdate-1(和trunc(sysdate(将有助于