patternsqlMinor
Getting the Date of Some Day of Last Week
Viewed 0 times
lastthegettingdateweeksomeday
Problem
In learning how to get the date of a day of the week from the previous week (e.g. the date of Monday from the previous week), I found the following two expressions coming up commonly, where you change the very last number (e.g. 0=Monday) depending on which day you want:
Both seem to return the correct Date
My question is - how does this work? It seems to be getting a count of weeks since
Also, are there edge cases one would need to be aware of where it might not give the expected results?
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0)
SELECT DATEADD(wk, DATEDIFF(wk, 7, GETDATE()), 0)Both seem to return the correct Date
2017-05-29 when I run it today (2017-06-17). My question is - how does this work? It seems to be getting a count of weeks since
6 or 7 weeks after 1900-01-01? And why does it work with both a 6 and 7?Also, are there edge cases one would need to be aware of where it might not give the expected results?
Solution
This takes advantage of the fact that
Here are the
Adding the number of weeks since
These three are equivalent:
rextester demo: http://rextester.com/BQX59903
1900-01-01 is a Monday. So adding n number of weeks will also be a Monday. Here are the
datetime values that are being represented by the integers in that expression:dateadd(week, datediff(week, 7 /*'19000108'*/, getdate()), 0 /*'19000101'*/)Adding the number of weeks since
1900-01-08 (the week after the first Monday) to 1900-01-01 returns one week less than the current week, i.e. Monday of last week. These three are equivalent:
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)rextester demo: http://rextester.com/BQX59903
Code Snippets
dateadd(week, datediff(week, 7 /*'19000108'*/, getdate()), 0 /*'19000101'*/)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)Context
StackExchange Database Administrators Q#175648, answer score: 9
Revisions (0)
No revisions yet.