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

如何修改MySQL查询以获取当前月及往前3个月的数据?

调整MySQL查询以包含当前月及往前3个月的完整数据

嘿,我明白你的需求啦——原查询是取当前日期往前3个月内的数据,但你想要的是当前月 + 往前3个完整月份的所有记录,不管查询当天是几号。比如2020年3月30日查询时,要覆盖2019年12月、2020年1月、2月、3月的全部数据,对吧?

我给你几个可行的方案,优先推荐性能最优的那个:

方案1:利用日期范围(推荐,支持索引)

这个方法直接用日期范围查询,能充分利用created字段上的索引,性能最好:

SELECT * 
FROM table 
WHERE created >= DATE_FORMAT(NOW() - INTERVAL 3 MONTH, '%Y-%m-01')
  AND created < DATE_FORMAT(NOW() + INTERVAL 1 MONTH, '%Y-%m-01')
ORDER BY created;

原理说明:

  • DATE_FORMAT(NOW() - INTERVAL 3 MONTH, '%Y-%m-01'):把当前日期减3个月后,截断到当月第一天(比如2020-03-30 → 2019-12-01)
  • DATE_FORMAT(NOW() + INTERVAL 1 MONTH, '%Y-%m-01'):把当前日期加1个月后,截断到当月第一天(比如2020-03-30 → 2020-04-01),用<而不是<=,可以避免包含下个月的零点数据

方案2:用年月格式化字符串比较

如果不需要考虑索引性能,这个写法更直观:

SELECT * 
FROM table 
WHERE DATE_FORMAT(created, '%Y-%m') 
  BETWEEN DATE_FORMAT(NOW() - INTERVAL 3 MONTH, '%Y-%m') 
  AND DATE_FORMAT(NOW(), '%Y-%m')
ORDER BY created;

原理说明:

把日期转成YYYY-MM格式的字符串,直接比较月份范围,比如2019-12到2020-03之间的所有月份都会被包含。

方案3:用年月数值计算

通过把年月转成数值(比如2020年3月→2020*12+3=24243)来比较范围:

SELECT * 
FROM table 
WHERE (YEAR(created) * 12 + MONTH(created)) >= (YEAR(NOW()) * 12 + MONTH(NOW()) - 3)
  AND (YEAR(created) * 12 + MONTH(created)) <= (YEAR(NOW()) * 12 + MONTH(NOW()))
ORDER BY created;

这个方法和方案2类似,同样会导致created字段的索引无法被使用,适合小数据量场景。

内容的提问来源于stack exchange,提问作者Giedrius Pirmasis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:17:36