条件str_to_date()如果格式是一种类型,否则什么都不做

时间:2014-11-26 11:21:16

标签: mysql date str-to-date

我有一个包含日期的表格,其中一些格式为31-DEC-2010,而其他格式为2011-01-13

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

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

是否有某种方法只能在具有此格式的行上运行此命令?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

现在,如果你使用日期格式执行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}$')

答案 2 :(得分:0)

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

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

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