如何修改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
相关产品推荐
相关产品推荐

