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
相关产品推荐
相关产品推荐

