获取上周某天的日期

GWR*_*GWR 4 sql-server t-sql datetime

在学习如何从前一周(例如从前一周的星期一的日期)获取星期几的日期时,我发现以下两个表达式很常见,您可以在其中更改最后一个数字(例如 0=星期一)取决于您想要的那一天:

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0)

SELECT DATEADD(wk, DATEDIFF(wk, 7, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)

2017-05-29当我今天(2017-06-17)运行它时,两者似乎都返回了正确的日期。

我的问题是 - 这是如何工作的?似乎是在数周后67数周后1900-01-01?为什么它同时适用于 a67

此外,是否存在需要注意的边缘情况,它可能无法提供预期结果?

Sql*_*Zim 9

这利用1900-01-01了星期一这一事实。因此,添加n周数也将是星期一。

以下是datetime由该表达式中的整数表示的值:

dateadd(week, datediff(week, 7 /*'19000108'*/, getdate()), 0 /*'19000101'*/)
Run Code Online (Sandbox Code Playgroud)

加上自1900-01-08(第一个星期一之后的那一周)以来的周数,1900-01-01返回比当前周(即上周的星期一)少一周的周数。

这三个是等价的:

select dateadd(week, datediff(week, 7 , getdate()), 0)
select dateadd(week, datediff(week, '19000108', getdate()), '19000101')
select dateadd(week, datediff(week, 0, getdate())-1, 0)
Run Code Online (Sandbox Code Playgroud)

reextester 演示:http ://rextester.com/BQX59903