如何在 T-SQL 中获取本月最后一个星期五的日期?
我将传递年份和月份作为参数,例如 201211。如果我传递“201211”作为参数,它应该返回“20121130”作为答案,因为它是 11 月 12 月的最后一个星期五的日期。
如何在 T-SQL 中获取本月最后一个星期五的日期?
我将传递年份和月份作为参数,例如 201211。如果我传递“201211”作为参数,它应该返回“20121130”作为答案,因为它是 11 月 12 月的最后一个星期五的日期。
1900 年 1 月 5 日是一个星期五。这使用该基准日期并计算任何给定月份的最后一个星期五,尽管您必须在该月内为其指定一个日期,而不仅仅是该月本身。将2012-12-01
in 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-05
WITH1900-01-06
等来使用它来获取最后一个星期六。
使用日历表会简单得多;在为您自己的需要创建适当的列之后,您可以这样写:
select
max([Date])
from
dbo.Calendar
where
YearAndMonth = 201211 and
DayOfWeek = 'Friday'
与使用函数相比,日历表通常是确定日期的更好解决方案,因为代码更具可读性,并且您可以使用自己的定义,例如在国家甚至公司之间差异很大的WeekNumber
事物FinancialQuarter
。
我为此创建了一个标量函数:
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
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