我有一个名为“Time”的列,此列当前设置为Varchar,因为我在某些更新中有一些损坏的时间。有些时间有非ASCII字符等。那么如何解决所有这些已损坏且未正确格式化的时间字段并设置为NULL?这样我就可以安全地将Time列转换回DateTime。更新中的正常时间字段通常采用2013-07-24 14:37:56
我想通过做类似的事情来解决它:
SELECT * FROM updates WHERE TIME not LIKE '....-..-.. ..:..:..'
但我不知道这是否是正确的正则表达方法并且效率最高。
答案 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
查询
答案 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
值。