9

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

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

4

4 回答 4

11

1900 年 1 月 5 日是一个星期五。这使用该基准日期并计算任何给定月份的最后一个星期五,尽管您必须在该月内为其指定一个日期,而不仅仅是该月本身。将2012-12-01in this 替换为您所在月份的日期

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

您也可以通过替换1900-01-05WITH1900-01-06等来使用它来获取最后一个星期六。

于 2012-12-21T11:17:42.607 回答
3

使用日历表会简单得多;在为您自己的需要创建适当的列之后,您可以这样写:

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

与使用函数相比,日历表通常是确定日期的更好解决方案,因为代码更具可读性,并且您可以使用自己的定义,例如在国家甚至公司之间差异很大的WeekNumber事物FinancialQuarter

于 2012-12-21T15:09:23.687 回答
2

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

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
于 2019-05-31T10:35:27.070 回答
1
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

于 2019-12-23T10:10:56.410 回答