使用T-sql获取本月的最后一个星期一

问题描述:

我知道这是一个相当普遍的问题,但是有谁知道检查日期是否是使用T-SQL的月份的最后一个星期一的好方法。我需要在存储过程中使用它来确定存储过程是否返回数据或什么都不做。使用T-sql获取本月的最后一个星期一

干杯!

如果当前日期是该月的最后一个星期一,以下选择将返回1,如果不是,则返回0

select 
case 
when datepart(dw, GETDATE()) = 2 and DATEPART(month, DATEADD(day, 7, GETDATE())) <> DATEPART(month, GETDATE()) 
then 1 
else 0 
end 

datepart(dw, GETDATE())返回星期几。星期一为2.第二部分为当前日期增加7天,并检查在7天内月份发生了变化(如果不是,则不是最后一个星期一)。

GETDATE()的更改为您要检查的任何日期。

编辑:

你可以把它变成一个通用的功能,与你喜欢的任何时间使用它:

CREATE FUNCTION 
IsLastMondayOfMonth(@dateToCheck datetime) 
RETURNS bit 
AS 
BEGIN 
DECLARE 
@result bit 

SELECT @result = 
    CASE 
     WHEN datepart(dw, @dateToCheck) = 2 AND DATEPART(month, DATEADD(day, 7, @dateToCheck)) <> DATEPART(month, @dateToCheck) 
    THEN 1 
ELSE 0 
END 
RETURN @result 
END 
+0

这很好,谢谢。如果select语句返回0,我不会返回任何数据,因为这些数据只在本月的最后一个星期一需要,而不是其他星期一。 – 2012-02-28 12:35:22

+1

+1也值得注意这依赖于datefirst 7 – 2012-02-28 12:37:36

也许是这样的:

DECLARE @YourDate DATETIME='2012-02-25' 
SELECT 
    CASE 
     WHEN @YourDate = DATEADD(wk, DATEDIFF(wk,0,DATEADD(month,DATEDIFF(MONTH,0,@YourDate),30)),0) 
     THEN 1 
     ELSE 0 
    END 
+0

真的很好的解决方案,我不同意解决方案的选择。尽管阅读起来比较复杂,但查询速度更快,并且不依赖于@@ datefirst。从我+1 – 2012-02-28 13:43:49

这将不管firstdate如何,选择日期是月份的最后一个星期一的日期。制作一个依赖于数据库设置的函数,实际上并不是很好的做法。

select d 
from (select '2012-02-20' d union all select '2012-02-27' union all select '2012-02-28') a 
where datepart(day, dateadd(day, 7 ,d)) < 8 and datediff(day, 0, d) %7 = 0 

虽然你已经接受了另一个答案,一个更简单的解决方案(在我看来)是使用calendar table有一列名为IsLastMondayOfMonth或类似的东西。日历表往往比函数更容易维护,因为不仅代码更清洁,而且当出现异常时(“由于今年的公共假日不寻常,我们需要在一天后执行月末处理,所以我'确定你可以修复系统来做到这一点吗?“)你可以更新一个表来处理它,而不是为代码添加可能的尴尬逻辑。