我有一个包含日期的表格,其中一些格式为31-DEC-2010
,而其他格式为2011-01-13
。
我正在尝试使用str_to_date()
函数让所有人都拥有日期格式,但由于无法转换2011-01-13而失败,因为它的某些日期已经是正确的格式,因为我之前运行过此命令但后来我添加了更多数据)
UPDATE `Table1` SET `date` = str_to_date( `date`, '%d-%M-%Y' );
是否有某种方法只能在具有此格式的行上运行此命令?
答案 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,表非常大,但如果它不起作用,通常应立即停止)