MySQL日期范围过滤报错#1292:截断不正确的日期时间值
问题原因及解决方法
为什么出现#1292警告?
你的SQL语句里,date_column是VARCHAR字符串类型,而STR_TO_DATE返回的是DATETIME类型。MySQL执行条件判断时,会尝试隐式把字符串类型的日期转换成DATETIME,但原字符串格式是日.月.年 时:分:秒,MySQL默认的日期转换规则识别不了这种格式,就会触发“截断不正确的日期时间值”的警告。
为什么不能用%d.%d.%m.%Y %H:%i:%s格式?
这个格式串完全不符合你的日期字符串结构:
- 你的日期是
12.12.2022 16:14:34,对应结构是日.月.年 时:分:秒,正确的格式串应该是%d.%m.%Y %H:%i:%s - 你写的
%d.%d.%m.%Y意味着日期要分成四段(日.日.月.年),但原字符串只有三段(日.月.年),格式不匹配,根本无法解析出正确的日期。
正确的解决方式
1. 临时修复:转换字段后再比较
把date_column也用STR_TO_DATE转换成DATETIME类型,避免隐式转换的问题,SQL改成:
select * from orders where STR_TO_DATE(date_column, '%d.%m.%Y %H:%i:%s') between STR_TO_DATE('24.06.2025 00:00:00', '%d.%m.%Y %H:%i:%s') and STR_TO_DATE('25.06.2025 00:00:00', '%d.%m.%Y %H:%i:%s') order by STR_TO_DATE(date_column, '%d.%m.%Y %H:%i:%s') ASC;
2. 长期优化:修改字段类型
把date_column的类型从VARCHAR改成DATETIME,这样不仅能彻底避免格式转换的问题,还能提升查询性能,也能约束字段只能存入合法的日期时间数据。修改语句:
ALTER TABLE orders MODIFY COLUMN date_column DATETIME;
注意:修改前要确保所有date_column的值都是合法的%d.%m.%Y %H:%i:%s格式,否则修改会失败。可以先执行下面的语句检查无效数据:
select date_column from orders where STR_TO_DATE(date_column, '%d.%m.%Y %H:%i:%s') is null;
内容的提问来源于stack exchange,提问作者Jalou
相关产品推荐
相关产品推荐

