在sql server中给定月份的最后一个星期五

时间:2012-12-21 10:45:28

标签: sql-server tsql sql-date-functions

如何在T-SQL中获取本月最后一个星期五的日期?

我将把年份和月份作为参数传递,例如201211。 如果我通过'201211'作为参数,它应该返回'20121130'作为答案,因为它是11月的最后一个星期五的日期。

4 个答案:

答案 0 :(得分:10)

1900年1月5日是星期五。这使用了基准日期并计算任何给定月份的最后一个星期五,但您必须在月份期间给它一个日期而不仅仅是月份本身。将此中的2012-12-01替换为您当月的日期

SELECT DATEADD(DY,DATEDIFF(DY,'1900-01-05',DATEADD(MM,DATEDIFF(MM,0,'2012-12-01'),30))/7*7,'1900-01-05')

您也可以通过将1900-01-05替换为1900-01-06等来使用此功能来获取上周六。

答案 1 :(得分:3)

使用calendar table会更简单;根据自己的需要创建适当的列后,您可以写下:

select 
    max([Date])
from 
    dbo.Calendar
where 
    YearAndMonth = 201211 and 
    DayOfWeek = 'Friday'

日历表通常是确定日期比使用函数更好的解决方案,因为代码更具可读性,您可以使用自己对WeekNumberFinancialQuarter等内容的定义。广泛地介于国家甚至公司之间。

答案 2 :(得分:0)

我为此创建了一个标量函数:

create function [dbo].[lastDWMonth]
    (
     @y int
    ,@m int
    ,@dw int
    )

returns date

as

begin

declare @d date

;with x as
    (
    select datefromparts(@y,@m,1) d

    union all

    select dateadd(day,1,d) from x where d < eomonth(datefromparts(@y,@m,1))
    )

select
    @d = max(d)
from
    x
where
    datepart(dw,d) = @dw

return @d

end

答案 3 :(得分:0)

Declare @d1 datetime = '2019-12-23'
Declare @searchDay int = 2 -- monday
select DATEADD(DAY, @searchDay-DATEPART(WEEKday, DateADD(day,-1, DATEADD(month, DATEDIFF(MONTH, 0, @d1)+1, 0))),DateADD(day,-1, DATEADD(month, DATEDIFF(MONTH, 0, @d1)+1, 0)))

这将为您提供日期为该月的最后一个星期一,您可以通过更改@searchDay

中的值来更改搜索