當你這樣做:
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設置。
感謝那些工作.. :) –