2010-12-02 155 views
1

我在Oracle中遇到以下奇怪的問題:請注意,我在SQL方面經驗不足,在Oracle中甚至更少。Oracle日期格式問題

如果我這樣做:

SELECT TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI') FROM dual 

我得到這個: 2010-12-02 18:39

所有有罰款。

但是,如果我這樣做:

UPDATE favorite_item 
SET favorite_item.last_used_date = TO_DATE(sysdate, 'YYYY-MM-DD HH24:MI') 
WHERE favorite_item.favorite_item_id = 1 

我得到這個在我的數據庫: 10-DEC-02

這是'02 12月10日這是不正確的

如果我這樣做是爲了確認:

SELECT TO_CHAR(favorite_item.last_used_date, 'YYYY-MM-DD HH24:MI') AS last_used_date 
    FROM favorite_item 
    WHERE favorite_item.favorite_item_id = 1 

我得到這樣的: 0002-12-10 00:00

這是完全錯誤的。

我在做什麼錯?我覺得日期設置工作不正常。

在此先感謝您的幫助。

回答

5

請勿在sysdate上使用TO_DATE(); sysdate已經是日期。

UPDATE favorite_item 
SET favorite_item.last_used_date = sysdate 
WHERE favorite_item.favorite_item_id = 1` 
+0

昨天晚上我在家裏居然發現了這個。猜猜這是我腦中的一天結束:) – 2010-12-03 09:38:01

+0

從來沒有這樣說過感謝。謝謝你的方式:) – 2010-12-21 18:22:07

1

sysdate返回一個日期,因此使用to_date(sysdate,...)將其轉換爲日期是多餘/不必要的。由於date由to_date函數使用Oracle默認值「DD-MON-YY」將日期轉換爲字符串,然後使用提供的格式「YYYY-MM-DD」返回日期, 。由於格式不匹配,甲骨文將年度視爲一年,將日視爲一年。這正常工作(但同樣,是多餘的):

select to_date(sysdate, 'DD-MON-YY') from dual; 
4

這個問題可以用在字符串以外的任何東西TO_DATE()函數。

至於你爲什麼會得到錯誤的結果,那麼當你在日期上使用to_date時會發生內部轉換。由於to_date實際上將輸入視爲字符串,因此您的日期最初會轉換爲字符串(根據您的NLS_DATE_FORMAT設置),然後再轉換回日期。因此不匹配。

SQL> select sysdate from dual; 

SYSDATE 
--------- 
02-DEC-10 

SQL> select to_date(sysdate,'YYYY-MM-DD') from dual; 

TO_DATE(S 
--------- 
10-DEC-02 

--- This is because, the above string is actually executed as 

SQL> select to_date(
      to_char('02-DEC-10','YYYY-MM-DD') from dual; 

TO_DATE(' 
--------- 
10-DEC-02 


SQL> select to_date(
    2     /* implicit conversion... dd-mon-yy' is my session's NLS_DATE_FORMAT */ 
    3     to_char(sysdate,'dd-mon-yy'), 
    4     'YYYY-MM-DD') 
    5  from dual; 

TO_DATE(/ 
--------- 
10-DEC-02