如何编写SQL查询获取指定日历年范围的订单数据?
解决日历年范围的订单查询问题
你的需求是获取当前日期所在年份往前数2个完整日历年的1月1日到当前日期的所有订单,比如当前是2023-10-18时,要覆盖2021-01-01至2023-10-18的订单。之前的语句取的是过去整整3年的区间,不符合要求,以下是两种可行的解决方案:
方案一:精准日期范围截取
SELECT * FROM ps_orders o WHERE o.date_add >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 YEAR), '%Y-01-01') AND o.date_add <= NOW();
逻辑说明:
DATE_SUB(NOW(), INTERVAL 2 YEAR):先算出当前日期往前推2年的日期(比如2023-10-18推2年得到2021-10-18)DATE_FORMAT(..., '%Y-01-01'):把这个日期格式化为对应年份的1月1日,也就是2021-01-01,这就是我们要的起始日期o.date_add <= NOW():限定结束日期为当前日期,确保不会包含当前日期之后的订单(如果存在的话)
方案二:基于年份筛选
SELECT * FROM ps_orders o WHERE YEAR(o.date_add) >= YEAR(NOW()) - 2 AND o.date_add <= NOW();
逻辑说明:
YEAR(NOW()) - 2:直接获取当前年份减2的数值(比如2023-2=2021)YEAR(o.date_add) >= 2021:筛选出订单年份在2021及之后的记录- 同样加上
o.date_add <= NOW(),避免包含当前年份中晚于当前日期的订单
两种方案的差异:
- 方案一直接基于日期范围查询,如果
date_add字段有索引,查询效率会更高 - 方案二更直观,逻辑容易理解,但如果
date_add没有索引,性能可能不如方案一
内容的提问来源于stack exchange,提问作者CHRISCOM
相关产品推荐
相关产品推荐

