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

使用T-sql获取当月的最后一个星期一,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我知道这是一个很普通的问题,但是有人知道用T-SQL检查日期是否是一个月的最后一个星期一的好方法吗。我需要在存储过程中使用它来确定存储过程是返回数据还是什么都不做 干杯 如果当前日期是该月的最后一个星期一,则以下选择将返回1,否则返回0 也许是这样的: DECLARE @YourDate DATETIME='2012-02-25' SELECT CASE WHEN @YourDate = DATEADD(wk, DATEDIFF(wk,0,DATEADD(month,D

我知道这是一个很普通的问题,但是有人知道用T-SQL检查日期是否是一个月的最后一个星期一的好方法吗。我需要在存储过程中使用它来确定存储过程是返回数据还是什么都不做


干杯

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


也许是这样的:

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

这将选择该日期为当月最后一个星期一的日期,而不考虑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

虽然您已经接受了另一个答案,但在我看来,一个更简单的解决方案是使用一个名为IsLastMondayOfMonth或类似的列。日历表往往比函数更易于维护,因为不仅代码更干净,而且当由于今年不寻常的公共假日而出现异常时,我们需要在一天后进行月末处理,我相信您可以修复系统来做到这一点?您只需更新一个表来处理它,而不必在代码中添加可能很难处理的逻辑。

这非常有效,谢谢。如果select语句返回0,我将不返回任何数据,因为该数据只在该月的最后一个星期一需要,而不是任何其他星期一。这是一个非常好的解决方案,我不同意选择该解决方案。虽然阅读起来更复杂,但您的查询速度更快,而且不依赖@datefirst+从我这里得到1
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
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