You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:45:26