MySQL查询过期记录出错:日期比较SQL语句问题排查
看起来你在处理日期筛选时踩了几个常见的MySQL日期格式坑,我来帮你拆解问题:
首先,你的SQL语句存在三个关键错误:
- 年份格式符使用错误:你用了
%y来解析2018这种四位年份,但MySQL里%y只对应两位年份(比如18),正确的四位年份格式符是%Y。用错的话,STR_TO_DATE会把2018错误解析,导致后续的比较完全偏离实际日期逻辑。 - 错误地用字符串比较代替日期比较:你把转换后的日期又通过
DATE_FORMAT转成了字符串,然后做字符串对比。字符串是按字符顺序逐个比较的,比如'22 Feb 2018'作为字符串会被认为比'31 Jan 2018'小,但实际日期22 Feb明明更晚,这就会导致筛选结果完全不符合预期。正确的做法是直接用日期类型和当前时间比较,不需要转成字符串。 - 表别名无中生有:语句里写了
e.value,但你根本没给radcheck表设置别名e,这属于语法错误(不过你说能返回结果,可能实际执行时你去掉了e.?如果没去掉的话应该会直接报错)。
接下来给你正确的查询语句:
SELECT * FROM radcheck WHERE STR_TO_DATE(value, '%d %M %Y %H:%i:%s') <= NOW();
这个语句的逻辑很清晰:先用STR_TO_DATE把value里的字符串转换成MySQL能识别的DATETIME类型(用%Y解析四位年份,%H:%i:%s处理时分秒),然后直接和当前时间NOW()做日期比较,这样就能精准筛选出已过期的记录。
另外,考虑到你有的记录没有秒部分(比如22 Feb 2018 12:03),也可以用更宽松的格式串,确保两种格式都能被正确解析:
SELECT * FROM radcheck WHERE STR_TO_DATE(value, '%d %M %Y %H:%i') <= NOW();
这样不管记录里有没有秒,都能正确转换成日期类型进行比较。
内容的提问来源于stack exchange,提问作者Maj.jad
相关产品推荐
相关产品推荐

