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

如何查询当前日期对应任意月前同日的订单记录(含月末边缘场景)

解决月末兼容的“任意月前同日”订单查询问题

我来帮你搞定这个头疼的日期匹配需求,尤其是那些容易踩坑的月末边缘场景!先理清楚核心逻辑:我们需要筛选出所有订单,当把它们的创建日期加上任意整数个月后,结果要么正好是当前日期,要么在当前日期是月末时,结果等于当前月份的最后一天(也就是那些创建在大日期的订单,比如31日,在小月份会自动调整到月末)。

最优SQL方案(无冗余子查询)

直接用日期函数判断就能搞定,逻辑清晰还高效:

SELECT *
FROM orders
WHERE 
    -- 非月末场景:严格匹配日部分
    (DAY(NOW()) < DAY(LAST_DAY(NOW())) AND DAY(created_at) = DAY(NOW()))
    -- 月末场景:匹配所有日部分≥当前日的订单(覆盖28/29/30/31日的情况)
    OR (DAY(NOW()) = DAY(LAST_DAY(NOW())) AND DAY(created_at) >= DAY(NOW()))

逻辑验证(对应你的示例)

我们逐个验证你给出的测试场景:

  • 当NOW()=2018-01-03(非月末):触发第一个条件,只选DAY(created_at)=3的订单,也就是2016-10-03和2018-01-03,符合预期。
  • 当NOW()=2018-02-28(平年2月末):触发第二个条件,选DAY(created_at)≥28的订单,包含2016-02-29(29≥28)、2016-12-31(31≥28)、2017-05-28(28≥28),完全匹配你的要求。
  • 当NOW()=2018-04-30(30天月末):触发第二个条件,选DAY(created_at)≥30的订单,包含2015-05-30(30≥30)、2016-12-31(31≥30),正确。
  • 当NOW()=2018-10-31(31天月末):触发第二个条件,只选DAY(created_at)=31的订单,也就是2016-12-31,符合预期。

为什么这个方案比你之前的好?

  1. 无冗余子查询:避免了关联子查询的性能开销,直接在WHERE子句中完成判断,执行效率更高。
  2. 完全覆盖边缘场景:自动处理闰年/平年2月、30/31天月份的所有情况,不需要额外写复杂的日期计算逻辑。
  3. 逻辑直观:一眼就能看懂每个条件对应的场景,后期维护成本低。

这个方案完全适配你每日运行的cron任务需求,确保每个符合条件的订单每月只会被选中一次(因为只有在对应日期才会触发匹配)。

内容的提问来源于stack exchange,提问作者Walerian Sobczak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:07:49