MySQL更新表日期列时格式转换失败问题求助
解决MySQL中DATE_FORMAT/STR_TO_DATE更新日期字段失败的问题
看起来你遇到的问题是因为analysedAt字段里存储的是ISO格式的日期字符串(比如2018-03-24T12:20:16+0000),而MySQL的日期函数无法直接处理这种带T和时区偏移的格式,导致了报错。我来帮你拆解错误原因并给出解决方案:
错误原因分析
- Error Code: 1292(DATE_FORMAT报错):
DATE_FORMAT函数的第一个参数需要是合法的datetime类型值,或者MySQL能自动解析的日期字符串。但你的字段值里的T和+0000是MySQL默认不识别的格式,所以函数尝试解析时会触发"截断不正确的datetime值"错误。 - Error Code: 1411(STR_TO_DATE报错):这应该是你尝试使用该函数时,格式模板和字符串不匹配导致的。比如如果错误地提取了
T12:20:16+0000这样的子串,而没有对应正确的模板,就会抛出"不正确的时间值"错误。
正确的更新SQL写法
下面提供两种可行的方案,你可以根据实际情况选择:
方案1:用STR_TO_DATE匹配完整的ISO格式
直接使用STR_TO_DATE并指定和原字符串完全匹配的格式模板,把字符串转成MySQL的datetime类型:
UPDATE quality SET analysedAt = STR_TO_DATE(analysedAt, '%Y-%m-%dT%H:%i:%s+0000') WHERE qualityId = 3;
如果你的数据里时区偏移可能不是固定的+0000,可以先截取掉最后5位的时区部分再处理:
UPDATE quality SET analysedAt = STR_TO_DATE(SUBSTRING(analysedAt, 1, LENGTH(analysedAt)-5), '%Y-%m-%dT%H:%i:%s') WHERE qualityId = 3;
方案2:替换T为空格后转成datetime
先把字符串里的T替换成空格,让格式变成MySQL默认能识别的YYYY-MM-DD HH:MM:SS,再用STR_TO_DATE转换:
UPDATE quality SET analysedAt = STR_TO_DATE(REPLACE(analysedAt, 'T', ' '), '%Y-%m-%d %H:%i:%s') WHERE qualityId = 3;
额外提示
如果analysedAt字段的类型是varchar,建议后续改成datetime类型来存储日期数据,这样能避免很多格式解析问题,也方便后续的日期运算和查询。
内容的提问来源于stack exchange,提问作者Deepak Kumbhar
相关产品推荐
相关产品推荐

