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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:35:21