2014-01-21 32 views
1

我有一個varchar2字段只包含日期(由於任何未知原因),但有些寄存器不是「to_date」格式。在Oracle中的日期格式更新不起作用

我需要利用日期格式進行查詢[例如: SELECT * FROM users_table其中status_date>「2014年1月21日」],但出現消息「ORA-01861:文字不匹配格式字符串「

所以我想我會更新使用此代碼的日期格式的一切:

update users_table set status_date = to_date(status_date, 'dd-mm-yy') where status_date > '2014-01-21'; 

它執行,但沒有寄存器發生了變化。請問我該如何解決這個問題?

+4

使用日期數據類型向表中添加新列。儘可能從varchar列更新它。放下你的varchar列並把它當作一個教訓,告訴你爲什麼你應該總是使用合適的數據類型。 –

回答

2

如果status_date具有多種格式的日期字符串,這將再次發生錯誤。

update users_table 
    set status_date = to_char(to_date(status_date, 'dd-mm-yy'),'YYYY-MM-DD') 
    where to_date(status_date ,'dd-mm-yy') > to_date('21-01-2014','DD-MM-YYYY'); 
+0

謝謝!有用!我只有兩種類型,所以我沒有任何問題。 – danfigue

1

我不確定這是否完成了您最終想要的功能,這是爲了避免表中的不同日期格式。我會像@DanBracuk建議的那樣,使用「alter table」向日期類型的表中添加一個新列。

然後改變你的查詢把TO_DATE結果到新柱(確保您的格式匹配像@MaheswaranRavisankar建議)。我懷疑你的varchar日期表中有多種格式,'dd-mm-yy'格式的字符串不匹配。所以這可能是手動和迭代的。繼續選取其餘的varchar格式,將日期類型放入新列中,直到沒有空日期列。然後擺脫你的varchar日期列,並再也不要這樣做:)

然後,你可能會添加一個約束到新的數據列,如果這適用於你的情況,如非空約束。

alter table users_table modify actual_status_date date NOT NULL; 

如果你這樣做,確保約束結束在你有的任何表創建腳本。