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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:01:02