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

MySQL创建临时表时CAST ISO格式日期出现1292 datetime截断错误如何解决

问题产生原因

该1292报错是MySQL不同执行场景下的类型校验规则差异导致的:

  • 直接执行普通SELECT语句时,MySQL对类型转换的警告默认做降级处理,仅抛出提示不会中断执行,带T、Z后缀的ISO格式字符串转DATE的截断告警不会上升为错误。
  • 执行CREATE TEMPORARY TABLE AS SELECT(CTAS)语句时,MySQL会启用更严格的类型校验规则,类型转换相关的警告会直接升级为错误抛出。MySQL原生CAST函数无法直接识别带T、Z的ISO8601格式字符串,转换时会触发截断判定,最终抛出报错。
可行解决方案

以下方案均不需要修改前端传入的原始ISO格式参数:

  • 方案1:用STR_TO_DATE函数显式解析ISO格式字符串
    显式指定日期格式匹配T、Z的位置,彻底消除截断警告,修改后的创建临时表SQL如下:
DROP TEMPORARY TABLE IF EXISTS TEMPDATA;
CREATE TEMPORARY TABLE IF NOT EXISTS TEMPDATA AS (
SELECT DISTINCT S.ID `ID`,S.name name FROM Student S
WHERE CAST(S.CREATED AS DATE) BETWEEN DATE(STR_TO_DATE('2021-11-30T18:30:00Z', '%Y-%m-%dT%H:%i:%sZ')) AND DATE(STR_TO_DATE('2021-12-31T18:29:59Z', '%Y-%m-%dT%H:%i:%sZ'))
ORDER BY name ASC LIMIT 0,50
);
  • 方案2:临时调整当前会话的SQL模式
    执行创建临时表语句前先执行SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', '');,临时关闭当前会话的严格类型校验,临时表创建完成后可按需恢复原有SQL模式。
  • 方案3:通过时间戳中转转换格式
    用DATE(FROM_UNIXTIME(UNIX_TIMESTAMP('2021-11-30T18:30:00Z'))替代原有CAST逻辑,依靠时间戳转换规避格式识别问题。

内容的提问来源于stack exchange,提问作者Sumit patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:57:02