2017-09-02 28 views
0

之前的日期格式的畫面結束,我有以下代碼,我想看看,如果日期是不到一年以前:uisng to_date函數仍然得到轉換整個輸入字符串錯誤

select id 
from mytable 
where id= :p_id 
and (to_date(trunc(sysdate), 'yyyy-mm-dd') - to_date(datewhen, 'yyyy-mm-dd')) < 365; 

我不斷收到錯誤:

ORA-01830: date format picture ends before converting entire input string

尋找與StackOverflow上同樣的錯誤我看到的解決辦法通常是使用我做的,所以我不能確定爲什麼這是發生to_date函數等問題。 datewhen字段的類型爲Date

+0

你不&#39;噸需要使用to_date函數在 「TO_DATE(TRUNC(SYSDATE), 'YYYY-MM-DD')」,因爲你已經alread使用trunc()。 – WellingtonD

+0

對已經是「日期」的值使用'to_date()'是毫無意義的。不要那樣做。 –

回答

0

請勿使用to_date()與DATE數據類型的柱面。 to_date()將字符串轉換爲DATE數據類型的值。將DATE轉換爲DATE是沒有意義的。在第一步datewhen DATE類型的列將通過使用默認日期格式(最可能不是'yyyy-mm-dd')隱式轉換爲字符數據類型,這是ORA-01830錯誤的罪魁禍首。

所以你的說法應該是這個樣子:

select id from mytable where id = :p_id and (trunc(sysdate) - trunc(datewhen)) < 365;  

我計算而不是幾天在幾個月或幾年的區別:

... where months_between(sysdate, datewhen) < 12 
0

您使用TO_DATE函數當值字符格式

語法

TO_DA的語法在甲骨文/ PLSQL TE功能是:

TO_DATE(string1 [, format_mask] [, nls_language]) 
1

如果您datewhen列是CHAR/VARCHAR格式化爲yyyy-mm-dd那麼你必須做datewhento_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; 
+0

你也可以使用'add_month {SYSDATE,-12)' –

+0

謝謝Wernfried,很好!我忘記了'add_months'。 –