MySQL日期转换异常:JSON日期转换为何时而成功时而报错?
MySQL日期转换报错:Truncated incorrect datetime value 的问题解析
核心差异:单独查询与UPDATE关联查询的转换逻辑不同
单独执行SELECT Date('2022-09-22T05:49:00.000Z')时,MySQL针对字符串常量采用宽松格式解析,会自动忽略T、Z这类非标准日期分隔符,因此能正常转换;但在你的UPDATE关联查询中,t.d是聚合函数MIN(t.DueDate)的返回值:
- 若
tablexx.DueDate是JSON类型,聚合后的值可能保留了JSON的隐性格式标记,导致MySQL解析时判定为非法; - MySQL处理字段值而非常量时,会启用更严格的日期校验逻辑,尤其是当
sql_mode包含STRICT_TRANS_TABLES等严格模式时,轻微的格式不符合就会触发截断报错。
查询报错原因、截断逻辑与判定规则的官方渠道
- MySQL官方函数文档:查阅
DATE()函数的说明页,里面明确了字符串转日期的支持格式、宽松/严格模式对转换的影响,以及非法格式的判定标准; - SQL模式(sql_mode)文档:重点查看
STRICT_TRANS_TABLES、NO_ZERO_DATE等模式的作用,这些模式直接控制日期转换时是否触发报错; - MySQL错误手册:针对「Truncated incorrect datetime value」报错,手册会详细列出触发场景、截断逻辑(比如哪些字符会被强制截断、哪些格式会被判定为无效)。
快速解决当前同步问题的方案
可以先对聚合后的日期值做字符串预处理,去除非标准分隔符后再转换:
update table_1 l inner join table_2 o on l.xxxxx = o.yyyyy inner join ( select t.some_id_1, t.some_id_2, min(t.DueDate) d from tablexx t where t.abcd = 'som-value' group by some_id_1, some_id_2 ) t on o.OpportunityId = t.some_id_2 set update_column_1 = DATE(REPLACE(REPLACE(t.d, 'T', ' '), 'Z', '')), update_colum_2 = t.some_id_1;
通过REPLACE将T替换为空格、Z替换为空,把格式统一为MySQL兼容的YYYY-MM-DD HH:MM:SS.fff,再用DATE()提取日期部分。
内容的提问来源于stack exchange,提问作者Oo-_-oO
相关产品推荐
相关产品推荐

