Mysql Regex,整理出损坏的时间格式

时间:2014-04-28 10:18:23

标签: mysql

我有一个名为“Time”的列,此列当前设置为Varchar,因为我在某些更新中有一些损坏的时间。有些时间有非ASCII字符等。那么如何解决所有这些已损坏且未正确格式化的时间字段并设置为NULL?这样我就可以安全地将Time列转换回DateTime。更新中的正常时间字段通常采用2013-07-24 14:37:56

的格式

我想通过做类似的事情来解决它:

SELECT * FROM updates WHERE TIME not LIKE '....-..-.. ..:..:..'

但我不知道这是否是正确的正则表达方法并且效率最高。

enter image description here

3 个答案:

答案 0 :(得分:0)

SELECT * FROM updates WHERE DATE_FORMAT(`TIME`, '%Y-%m-%d %H:%i:%s') IS NULL

函数DATE_FORMAT将尝试格式化TIME在' Y-m-d H:i:s'格式,如果函数无法格式化TIME,它将返回NULL,以便您知道哪个格式不合适,然后您可以手动处理它们或使用UPDATE查询

将它们设置为null

答案 1 :(得分:0)

您可以尝试在varchar列上使用MySQL STR_TO_DATE

update updates set `time` = null 
where str_to_date(`time`,'%Y-%m-%d %H:%i:%s') is null; 

答案 2 :(得分:0)

  

那么如何解决所有这些已损坏且未正确格式化的时间字段并设置为NULL?

如果此CAST列的TIME返回NULL,则您可以将其设置为NULL或所需的日期时间字符串值。

选择的示例:

mysql> select @ts:=cast( '2013-07╞ƒ~¥14:37:56' as datetime ) ts, @ts is null;
+------+-------------+
| ts   | @ts is null |
+------+-------------+
| NULL |           1 |
+------+-------------+

更新示例

update table_name 
   set time_coumn = null -- or a valid date time string value
 where cast( time_column as datetime ) is null

将列值设置为NULL后,您可以为那些值为datetime的记录设置有效的NULL值。