如果您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()'是毫無意義的。不要那樣做。 –