如何用DATEADD函数获取6个月前当月月初至今的日期范围数据?
解决滚动时间段(6个月前当月月初至今)的日期筛选问题
你的问题出在DATEPART(m,GETDATE())的用法上——这个函数返回的是当前月份的数字值(比如1月返回1,7月返回7),而DATEADD会把这个数字当成「1900-01-01之后的第N天」来计算。比如当前是1月,DATEADD(mm,-6,1)实际得到的是1899-07-01,这个日期远早于你表中数据的起始时间,所以BETWEEN条件会返回所有符合<= GETDATE()的数据。
要获取6个月前当月的月初,可以用两种靠谱的写法:
方法1:用DATEFROMPARTS构造月初日期
WHERE [DateField] BETWEEN DATEADD(mm, -6, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)) AND GETDATE()
DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)会生成当前月份的第一天(比如2023-01-01)- 再用
DATEADD(mm,-6,...)减去6个月,就得到6个月前的当月月初(比如2022-07-01)
方法2:用DATEDIFF+DATEADD组合获取月初
这是SQL Server里常用的「快速取月初」技巧:
WHERE [DateField] BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 6, 0) AND GETDATE()
DATEDIFF(mm, 0, GETDATE())计算从1900-01-01到现在的总月份数- 减去6后,再用
DATEADD(mm, ..., 0)把这个月份数加回1900-01-01,得到的就是6个月前的当月月初
额外提醒
如果[DateField]包含时间部分(比如2023-01-20 15:30:00),GETDATE()会带当前时间,可能会漏掉当天还没到这个时间的数据。建议把结束日期转为纯日期格式:
WHERE [DateField] BETWEEN /* 起始日期 */ AND CAST(GETDATE() AS DATE)
或者写成:
WHERE [DateField] >= /* 起始日期 */ AND [DateField] <= CAST(GETDATE() AS DATE)
内容的提问来源于stack exchange,提问作者EJF
相关产品推荐
相关产品推荐

