如何用MySQL WHERE子句结合日期时间列查询当前已过期记录?
正确获取已过期记录的MySQL查询方法
问题分析
你的原查询存在两个关键问题:
- 第二个条件中使用
DATE_FORMAT将拼接后的日期时间转为字符串后和NOW()比较,属于字符串比较而非时间类型比较,容易出现逻辑错误(比如格式不匹配时的自动转换异常)。 - 拆分日期和时间的判断逻辑冗余,直接合并成完整的过期时间后与当前时间对比即可。
正确实现方式
我们需要将expiry_date和expiry_time拼接后,用STR_TO_DATE转换为DATETIME类型,再和当前时间NOW()直接比较,筛选出过期时间≤当前时间的记录:
SELECT * FROM your_table_name WHERE STR_TO_DATE(CONCAT(expiry_date, ' ', expiry_time), '%d-%m-%Y %h:%i %p') <= NOW();
关键说明
%h:%i %p是匹配11:00 AM这种12小时制时间的格式符(%p识别AM/PM),和你的expiry_time格式完全匹配。- 转换后的时间是标准的
DATETIME类型,和NOW()(同样是DATETIME类型)的比较是精准的时间逻辑对比,不会出现字符串比较的歧义。 - 不需要拆分日期和时间分别判断,一条条件就能覆盖所有已过期的情况:无论是日期早于当前日期,还是日期等于当前但时间早于/等于当前时间的记录。
示例验证
假设当前时间是2023-01-09 12:00 PM:
- Sample1的过期时间是
2023-01-09 11:00 AM,≤当前时间,会被选中。 - Sample2的过期时间是
2023-01-09 03:00 PM,晚于当前时间,不会被选中。 - Sample3的过期时间是
2023-01-08 10:00 PM,≤当前时间,会被选中。
内容的提问来源于stack exchange,提问作者jai
相关产品推荐
相关产品推荐

