我正在制作一个表,其中有两种格式的日期存储在一个字段中,有些是mm / dd / yy,而较新的条目是yyyy / mm / dd,就像它们应该的那样。
我想运行像这样的查询
UPDATE table
SET date_field = DATE_FORMAT(date_field, '%Y/%m/%d')
WHERE date_field = DATE_FORMAT(date_field, '%m/%d/%y')
但它没有成功。我得到的一个结果是,它只是将%m数据转换为%Y并且真正弄乱了数据。
有什么想法?
答案 0 :(得分:15)
您想使用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类型
答案 1 :(得分:5)
您希望使用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 '__/__/____'
答案 2 :(得分:1)
思考?啊,实际上是三个:
不要重新发明轮子。是的,是的,我知道从头开始做的事情很诱人,之前只有一百万人发明过(没有讽刺意图),但MySQL有一个好的,有效的,可用的DATE
格式,使用它;只对输入/输出进行格式化。这样可以避免这些数据混淆(日期本身)和表示(日期格式)。
至于数据,还原已知良好的备份(你有备份,对吗?) - 在一般情况下,没有万无一失的方法来判断未转换的y / m / d来自已经转换的m / d / y,并且日期可以用于任何实际目的。 (尤其不是在2010年 - 例如08/10/09
可能意味着几个有效日期。)
另外,只存储2位日期的想法是什么?这正是那种短视的吝啬,带来了Y2K的时间和金钱汇。 (如果您以日期格式存储日期,则避免使用。)