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

时间:2012-02-28 12:14:13

标签: sql sql-server-2008 tsql

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

干杯!

4 个答案:

答案 0 :(得分:5)

如果当前日期是该月的最后一个星期一,则以下选项将返回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

答案 1 :(得分:2)

也许是这样的:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

虽然您已经接受了另一个答案,但更简单的解决方案(在我看来)是使用calendar table,其中包含一个名为IsLastMondayOfMonth的列或类似的列。日历表往往比功能更容易维护,因为不仅代码更清晰,而且当出现异常时(“因为今年公共假期不寻常,我们需要在一天后进行月末处理,我“我确定你可以修复系统来做到这一点吗?”)你可以更新一个表来处理它,而不是为你的代码添加可能很笨拙的逻辑。