如何编写SQL查询获取给定日期三个月前含月初的数据?
计算指定日期对应时间段数据的SQL实现指导
需求
给定一个目标日期,需查询两类数据:
- 目标日期往前推3个月所在月份的所有数据
- 目标日期上年同月的所有数据
需包含对应月份的全量数据(含月初记录)。
样本数据集
Date,value 28-12-2022,10 31-01-2023,32 30-10-2023,33 30-11-2023,32 30-12-2023,31 31-01-2024,01 29-02-2024,02
示例场景
当目标日期为31-01-2024时,预期输出:
Date,value 31-01-2023,32 30-10-2023,33
错误查询分析
之前尝试直接通过月份和年份硬匹配的写法存在逻辑错误,比如错误语句中把目标日期的月份当成了3,导致筛选条件完全不符合需求:
Declare date1 date= '31-01-2024' select * from table where MONTH(date1) = 3 AND YEAR(Date) = YEAR(date1) - 1
正确SQL实现(SQL Server)
通过日期函数精准计算目标时间段,再匹配对应月份的数据:
DECLARE @target_date DATE = '31-01-2024'; SELECT Date, value FROM your_table_name WHERE DATEFROMPARTS(YEAR(Date), MONTH(Date), 1) IN ( -- 目标日期往前推3个月的当月第一天 DATEFROMPARTS(YEAR(DATEADD(month, -3, @target_date)), MONTH(DATEADD(month, -3, @target_date)), 1), -- 目标日期上年同月的当月第一天 DATEFROMPARTS(YEAR(DATEADD(year, -1, @target_date)), MONTH(DATEADD(year, -1, @target_date)), 1) ) ORDER BY Date DESC;
说明
DATEADD(month, -3, @target_date):计算目标日期往前推3个月的日期DATEADD(year, -1, @target_date):计算目标日期上年同月的日期DATEFROMPARTS(...):将日期转换为当月第一天,用于统一匹配整个月份的记录- 最终筛选出属于这两个月份的所有数据,按日期倒序排列
内容的提问来源于stack exchange,提问作者Mahendran V M
相关产品推荐
相关产品推荐

