MS SQL Server 2017如何计算Date列对应日期的前一个周日
报错原因
你提交的SQL语句存在两处错误:
- 类型运算错误:将
DATEPART(weekday, GETDATE())返回的整数,与CAST(Processed_Date As date)返回的日期类型直接做加减运算,两种数据类型不兼容,直接触发类型冲突报错 - 逻辑错误:你需要计算
Processed_Date对应的前一个周日,但原写法DATEADD的基准日期用了GETDATE(),最终计算结果只和当前日期有关,和Processed_Date完全无关
正确实现代码
通用写法(不受服务器周起始日设置影响)
该写法适配任意@@DATEFIRST配置,返回Processed_Date对应日期所在周的周日(若当日为周日则返回当日):
DATEADD(day, -(DATEPART(weekday, DATEADD(day, @@DATEFIRST - 1, CAST(Processed_Date AS DATE))) % 7), CAST(Processed_Date AS DATE) ) AS [Last Sunday]
如果需要当日为周日时返回上一周的周日,调整偏移逻辑即可:
DATEADD(day, -CASE WHEN DATEPART(weekday, DATEADD(day, @@DATEFIRST - 1, CAST(Processed_Date AS DATE))) % 7 = 0 THEN 7 ELSE DATEPART(weekday, DATEADD(day, @@DATEFIRST - 1, CAST(Processed_Date AS DATE))) % 7 END, CAST(Processed_Date AS DATE) ) AS [Last Sunday]
简化写法(仅适配默认周起始日配置)
如果你的SQL Server实例保持默认配置@@DATEFIRST = 7(即周日为一周的第一天),可以用更精简的写法:
DATEADD(day, -(DATEPART(weekday, CAST(Processed_Date AS DATE)) - 1), CAST(Processed_Date AS DATE)) AS [Last Sunday]
内容的提问来源于stack exchange,提问作者Lee Barry
相关产品推荐
相关产品推荐

