如果您datewhen
列是CHAR/VARCHAR格式化为yyyy-mm-dd
那么你必须做datewhen
的to_date
转换,但不能在SYSDATE
:这已经是一个日期和不需要转换。
内的365日内的日期进行筛选,把它比作SYSDATE - 365
:
select id
from mytable
where id = :p_id
and to_date(datewhen, 'yyyy-mm-dd') > sysdate - 365;
但一年并不总是365天:在闰年是366天。为了得到一个一年前值总是正确的,从目前的日期减去一年的时间间隔:
select id
from mytable
where id = :p_id
and datewhen > sysdate - interval '1' year;
一两件事:在Oracle DATE
类型不只是一个日期;这是一个日期和时间。 SYSDATE
返回当前日期和时间。试试这个查询:
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
除非你在午夜时分运行它,否则你也会看到一个时间组件。
说出您的查询在2017年9月2日上午10点运行,并且您正在寻找去年的日期。您预计会得到2016年9月3日的日期,但您不会,因为上午10点SYSDATE
是2016年9月3日的10:00:00。这比2016年9月3日(即2016年9月3日0:00:00)的明确日期更长,因此不包括'2016-09-03'的datewhen
的记录。
要忽略Oracle DATE
值的时间部分,请使用TRUNC
。你最终的查询应该是这个样子:
select id
from mytable
where id = :p_id
and datewhen > trunc(sysdate) - interval '1' year;
你不'吨需要使用to_date函数在 “TO_DATE(TRUNC(SYSDATE), 'YYYY-MM-DD')”,因为你已经alread使用trunc()。 – WellingtonD
对已经是“日期”的值使用'to_date()'是毫无意义的。不要那样做。 –