1

我有一张带有日期的表格,其中一些有这种格式31-DEC-2010,而另一些有这种格式2011-01-13

我正在尝试使用该str_to_date()函数使所有它们都具有日期格式,但是由于它无法转换 2011-01-13 而失败(某些日期已经采用正确的格式,因为我之前运行过此命令,但后来我添加了更多数据)

UPDATE `Table1` SET `date` = str_to_date( `date`, '%d-%M-%Y' );

有没有办法只在具有这种格式的行上运行这个命令?

4

3 回答 3

4

首先选择日期格式不正确的记录,然后更新这些记录:

UPDATE `Table1` t
JOIN (
  SELECT * FROM `Table1`
  WHERE str_to_date( `date`, '%d-%M-%Y' ) IS NOT NULL
) t2
ON t.id = t2.id
SET t.`date` = str_to_date( t.`date`, '%d-%M-%Y' )

工作演示:http ://sqlfiddle.com/#!2/f01565/1

在 UPDATE 语句中使用str_to_date会出错,以下将不起作用:

UPDATE `Table1` 
SET `date` = 
  CASE WHEN str_to_date( `date`, '%d-%M-%Y' ) IS NOT NULL
       THEN str_to_date( `date`, '%d-%M-%Y' )
       ELSE `date`
  END
于 2014-11-26T11:27:42.103 回答
1

您应该考虑将数据类型更改为date并将日期存储在 mysql 格式中,这将使生活变得简单。

现在,如果您使用日期格式执行 str_to_date() 并且输入不是格式,那么它将返回 null。

mysql> select str_to_date( '2011-01-13', '%d-%M-%Y' ) as date;
+------+
| date |
+------+
| NULL |
+------+

所以你可以做的伎俩

update 
`Table1` 
SET `date` = case when str_to_date( `date`, '%d-%M-%Y' ) is null then date 
else str_to_date( `date`, '%d-%M-%Y' ) end

更新

这可能属于警告

mysql> select str_to_date( '2011-01-13', '%d-%M-%Y' );
+-----------------------------------------+
| str_to_date( '2011-01-13', '%d-%M-%Y' ) |
+-----------------------------------------+
| NULL                                    |
+-----------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings ;
+---------+------+-----------------------------------------------------------------+
| Level   | Code | Message                                                         |
+---------+------+-----------------------------------------------------------------+
| Warning | 1411 | Incorrect datetime value: '2011-01-13' for function str_to_date |
+---------+------+-----------------------------------------------------------------+
1 row in set (0.01 sec)

所以另一种方法是regex用于更新

update 
`Table1` 
SET `date` = str_to_date( `date`, '%d-%M-%Y' )
where `date` not REGEXP('^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$')
于 2014-11-26T11:28:46.637 回答
0

我只是想..如果我写的话,也许它会起作用:

mysql> UPDATE `Table1` 
       SET `date` = str_to_date( `date`, '%d-%M-%Y' )
       WHERE date LIKE '%d-%M-%Y';

(我正在运行命令atm,表很大,但是如果它不起作用,它通常应该立即停止)

于 2014-11-26T11:25:31.627 回答