|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 9:08 AM
Points: 6,
Visits: 397
|
|
|
|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Wednesday, February 20, 2013 6:28 PM
Points: 1,
Visits: 39
|
|
| SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0)),3)
|
|
|
|
|
Ten Centuries
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 7:31 AM
Points: 1,164,
Visits: 2,601
|
|
|
|
|
|
Ten Centuries
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 7:31 AM
Points: 1,164,
Visits: 2,601
|
|
|
|
|
|
SSC-Enthusiastic
      
Group: General Forum Members
Last Login: Monday, February 11, 2013 5:58 PM
Points: 100,
Visits: 347
|
|
Here is an alternate version using a Tally table.
DECLARE @SelectedDate DATE = '2012-02-01' --GETDATE() DECLARE @DesiredDay TINYINT = 5
SELECT TOP 1 NextDay, DATENAME(WEEKDAY, NextDay) AS NameOfDay FROM ( SELECT DATEADD(DAY, N, @SelectedDate) AS NextDay FROM Tally WHERE N <= 14 ) x WHERE DATEPART(WEEKDAY, NextDay) = @DesiredDay ORDER BY NextDay
It should be easy to turn into a function.
|
|
|
|
|
Ten Centuries
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 7:31 AM
Points: 1,164,
Visits: 2,601
|
|
fahey.jonathan (1/20/2012) Here is an alternate version using a Tally table.
Jonathan, Nearly but not quite, that just gets next thursday. Not the next first thursday of the month.
Here's another version loosely based on your Tally table idea.
I'll try to explain what it does: 1. Gets all days for this and the next month. 2. Reduces that set to just Thursdays 3. Ranks partitioned by month, to number the Thursdays 1 - n 4. Gets the top Thursday with a rank of 1 that is greater than the target date
DECLARE @now DATETIME = '20120201'
SELECT TOP 1 theDay FROM ( SELECT theDay, --== --== Rank the thursdays 1-4 (or possibly 5) --== theRank = RANK() OVER(PARTITION BY MONTH(theDay) ORDER BY theDay) FROM ( --== --== Get all the days in this and next month --== SELECT DATEADD(dd,n-1,DATEADD(mm, DATEDIFF(mm,'19000101',@now ) ,'19000101')) theDay FROM Tally WHERE N <= DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm,'19000101',@now) ,'19000101'), DATEADD(mm, 2+DATEDIFF(mm,'19000101',@now) ,'19000101')) ) alldays WHERE --== --== Get just the Thursdays (note the adjustment for a DATEFIRST setting other than 7) --== (@@DATEFIRST + DATEPART(dw,theDay)) % 7 = 5 ) Thursdays WHERE theRank = 1 -- The first thursday AND theDay > @now -- After the target date ORDER BY theDay
-- Nigel Useful Links: How to post data/code on a forum to get the best help The "Numbers" or "Tally" Table - Jeff Moden
|
|
|
|
|
SSC-Enthusiastic
      
Group: General Forum Members
Last Login: Monday, February 11, 2013 5:58 PM
Points: 100,
Visits: 347
|
|
Jonathan, Nearly but not quite, that just gets next thursday. Not the next first thursday of the month.
I misread the original post. I thought the goal was to find the next Thursday, not the first Thursday of a month past today. Sorry.
|
|
|
|
|
Ten Centuries
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 7:31 AM
Points: 1,164,
Visits: 2,601
|
|
|
|
|
|
SSC-Enthusiastic
      
Group: General Forum Members
Last Login: Monday, February 11, 2013 5:58 PM
Points: 100,
Visits: 347
|
|
Because we know that the first Thursday of a month must be within 40 days of the selected date and must have a day number between 1 and 7, I can modify my original query with those parameters:
DECLARE @SelectedDate DATE = '2012-02-02' --GETDATE() DECLARE @DesiredDay TINYINT = 5 SELECT TOP 1 NextDay, DATENAME(WEEKDAY, NextDay) AS NameOfDay FROM ( SELECT DATEADD(DAY, N, @SelectedDate) AS NextDay FROM Tally WHERE N <= 40 ) x WHERE DATEPART(WEEKDAY, NextDay) = @DesiredDay AND DAY(NextDay) <= 7 ORDER BY NextDay
I think it is that easy. Let me know if I missed something.
|
|
|
|
|
Ten Centuries
      
Group: General Forum Members
Last Login: Tuesday, May 21, 2013 7:31 AM
Points: 1,164,
Visits: 2,601
|
|
|
|
|