如何在T-SQL中获取本月最后一个星期五的日期?
我将把年份和月份作为参数传递,例如201211。 如果我通过'201211'作为参数,它应该返回'20121130'作为答案,因为它是11月的最后一个星期五的日期。
答案 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'
日历表通常是确定日期比使用函数更好的解决方案,因为代码更具可读性,您可以使用自己对WeekNumber
,FinancialQuarter
等内容的定义。广泛地介于国家甚至公司之间。
答案 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