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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:37:03