2010-11-23 287 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年。 (如果你想以日期格式存储日期,那么可以避免)。