2016-05-25 19 views
1

當像下面那樣減去今天的日期時會給出正確的輸出。與SYSDATE的日期差異 - 值給出了什麼?

select 
    (TRUNC(to_date('25/05/2016','dd/mm/yyyy'))-TRUNC(to_date('02/01/2016','dd/mm/yyyy'))) 
from dual; 

輸出:144天

當取下面今天的日期廣告SYSDATE應該給144,但顯示了一些其他的價值?爲什麼?

select 
    (to_date(SYSDATE,'dd/mm/yyyy'))-(to_date('02/01/2016','dd/mm/yyyy')) 
from dual; 

輸出:-730343(顯示一些值)。

回答

1

你不需要使用to_date
使用trunc剝去sysdate的時間部分轉換一個date [sysdate]到date

嘗試;

select 
TRUNC(SYSDATE) - (to_date('02/01/2016','dd/mm/yyyy')) 
from dual; 
+0

感謝那些工作.. :) –

5

當你這樣做:

to_date(SYSDATE,'dd/mm/yyyy') 

你含蓄轉換SYSDATE,這已經是一個日期,到一個字符串 - 使用NLS_DATE_FORMAT。從似乎是DD-MON-RR的結果。所以你真的這樣做:

to_date(to_char(SYSDATE,'DD-MON-RR'),'dd/mm/yyyy') 

內部部分給你的字符串'25 -MAY-16'。當您轉換回與yyyy面具的日期,你有一個兩位數的年份,16,這被解釋爲一年0016,而不是2016年。你會真正得到你所期望的,如果你使用rrrr代替,但是這是一個快樂的副作用,它會仍然會打破與不同的NLS設置:

select to_date(SYSDATE,'dd/mm/yyyy') as bad_nls, 
    to_char(to_date(SYSDATE,'dd/mm/yyyy'), 'YYYY-MM-DD') as bad_string, 
    to_date(SYSDATE,'dd/mm/rrrr') as ok_nls, 
    to_char(to_date(SYSDATE,'dd/mm/rrrr'), 'YYYY-MM-DD') as ok_string 
from dual; 

BAD_NLS BAD_STRING OK_NLS OK_STRING 
--------- ---------- --------- ---------- 
25-MAY-16 0016-05-25 25-MAY-16 2016-05-25 

請注意,您當前的NLS面具和隱式轉換爲字符串,你不能告訴第一和第三結果之間的差異;但顯然在第二和第四個結果中顯示四位數年份時是錯誤的。

隨着你的你與2016年1月2日比較0016-05-25隱式轉換,它是給你-730343因爲這是多少天有2000年調整了144天,你所期望的缺口是。

由於Praveen已經表示您不需要爲SYSDATE使用to_date(),並且如果您嘗試將時間部分設置爲午夜,則可以只使用truncate it

select date '2016-05-25' - date '2016-01-02' as diff1, 
    date '2016-05-25' - date '0016-05-25' as diff2, 
    date '0016-05-25' - date '2016-01-02' as diff3, 
    trunc(sysdate) - date '2016-01-02' as diff4 
from dual; 

    DIFF1  DIFF2  DIFF3  DIFF4 
---------- ---------- ---------- ---------- 
     144  730487 -730343  144 

更普遍,但是,請不要使用兩位數字的年份(唉,似乎我們已經忘了2000年的教訓!),並且不依賴於NLS設置。