对于 9 月 12 日的选项,您会怎么做?听起来你有两个不同的场景。
无论哪种情况,如果您有日期表或日历表,我都会使用它。如果没有,请设置一个。我强烈推荐它。 Ed Pollock 写了一篇关于日期表设置的精彩文章:Designing a Calendar Table。 SQLServer.Info 在这里有一个很好的表示例:Table Example。第二个很好的例子Table Setup
Table Setup。这就是它应该的样子。或者至少是类似的东西。您可以添加更多列进行更多比较。
设置好日历表后,只需将所需日期与表进行比较即可。
这是根据日期表获取下个月第一周的方法
DECLARE @Date DATE = '8/2/2019';
SELECT [dt].Date
FROM [Datetbl] AS [dt]
WHERE [dt].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date)) -- is same day of the week
AND [dt].Month = DATEPART(month, DATEADD(MONTH, 1, @Date)) -- Grab the month number for "Next Month"
AND [dt].Year = DATEPART(year, DATEADD(MONTH, 1, @Date)) -- Grab year of next month since that will be different for December
AND [dt].[WeekOfMonth] IN
(SELECT MIN([WeekOfMonth])
FROM [Datetbl] AS [dt1]
WHERE [dt1].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date))
AND [dt1].Month = DATEPART(month, DATEADD(MONTH, 1, @Date))
AND [dt1].Year = DATEPART(year, DATEADD(MONTH, 1, @Date))
); -- returns Sept 6
这是根据日期表获取该月最后一个工作日的方法
DECLARE @Date DATE = '9/26/2019';
SELECT [dt].Date
FROM [Datetbl] AS [dt]
WHERE [dt].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date)) -- is same day of the week
AND [dt].Month = DATEPART(month, DATEADD(MONTH, 1, @Date)) -- Grab the month number for "Next Month"
AND [dt].Year = DATEPART(year, DATEADD(MONTH, 1, @Date)) -- Grab year of next month since that will be different for December
AND [dt].[WeekOfMonth] IN
(SELECT MAX([WeekOfMonth])
FROM [Datetbl] AS [dt1]
WHERE [dt1].[Weekday] = DATEPART([weekday], DATEADD(day, -1, @Date))
AND [dt1].Month = DATEPART(month, DATEADD(MONTH, 1, @Date))
AND [dt1].Year = DATEPART(year, DATEADD(MONTH, 1, @Date))
); -- returns Oct 31st
希望这会有所帮助。