2010-11-23 286 views
4

我在一個表中有兩種格式的日期存儲在一個字段中,一些是以mm/dd/yy爲單位,而較新的條目是以yyyy/mm/dd爲單位。在mysql中更新日期格式

我要像這樣運行

UPDATE table 
    SET date_field = DATE_FORMAT(date_field, '%Y/%m/%d') 
WHERE date_field = DATE_FORMAT(date_field, '%m/%d/%y') 

的查詢,但它只是不工作。我得到的一個結果是,它只是將%m數據轉化爲%Y,並且真正搞亂了數據。

有什麼想法?

+1

date_field的列類型是什麼?如果是日期或時間戳 - 你不能重新訂購YMD到mdy – Mikhail 2010-11-23 19:05:54

回答

13

您想要使用STR_TO_DATE函數,而不是DATE_FORMAT。另外,我假設你只想更新錯誤日期,所以我猜你可以這樣做:

UPDATE your_table 
SET date_field = DATE(STR_TO_DATE(date_field, '%m/%d/%Y')) 
WHERE DATE(STR_TO_DATE(date_field, '%m/%d/%Y')) <> '0000-00-00'; 

P.S.表格包含,而不是字段。而且你不應該使用字符串類型來保存日期,但DATE類型

+0

謝謝,這應該得到理順非常好。然後,我們可以繼續前進,將網站的其餘部分整理出來。它從ASP到PHP和MS SQL到MySQL!它仍然站着,真是太神奇了!哈! – 2010-11-24 15:50:19

4

要使用STR_TO_DATE首先將不正確的字符串轉換爲實際日期對象,然後使用DATE_FORMAT將其重新轉換爲所需格式的字符串。

此外,您的WHERE條件將不會像那樣工作。您應該使用LIKE查找錯誤格式的字符串。

UPDATE your_table SET date_field = 
    DATE_FORMAT(STR_TO_DATE(date_field, '%m/%d/%y'), '%Y/%m/%d') 
WHERE date_field LIKE '__/__/____' 
+0

謝謝,它的工作 – 2015-02-16 11:23:39

1

想法?是啊,三竟:

  • 不推倒重來。是的,是的,我知道它很容易從零開始做只有一百萬人以前發明過的東西(沒有諷刺意圖),但MySQL有一個好的,有效的和可用的格式,使用它;只對輸入/輸出進行格式化。這可以讓你避免這些數據混合(日期本身)和演示(日期格式)。

  • 至於數據,恢復已知良好的備份(你有備份吧?) - 在一般情況下,沒有萬無一失的方法告訴未轉換的Y/M /從已經轉換d米/日/年和日期f *** ed爲任何實際目的。 (特別是在2010年 - 例如08/10/09可能意味着幾個有效的日期)。

  • 此外,什麼樣的想法是它只存儲日期的2位數字?這恰恰是短視的一分錢捏,導致時間和金錢沉澱是2000年。 (如果你想以日期格式存儲日期,那麼可以避免)。