T-SQL获得今年最后一个星期五的发薪日

T-SQL获得今年最后一个星期五的发薪日,sql,sql-server,Sql,Sql Server,我知道2013年1月3日是发薪日,我们每两周发一次薪,我可以用以下公式计算未来的发薪日期。这段代码告诉我2013年12月20日是发薪日。没错 declare @StartDate datetime = '1/4/13' declare @FromDate datetime = '12/15/' + cast(year(getdate()) - 1 as char(4)) select dateadd(day, 14*cast(datediff(day, @StartDate, @FromDat

我知道2013年1月3日是发薪日,我们每两周发一次薪,我可以用以下公式计算未来的发薪日期。这段代码告诉我2013年12月20日是发薪日。没错

declare @StartDate datetime = '1/4/13'
declare @FromDate datetime = '12/15/' + cast(year(getdate()) - 1 as char(4))

select dateadd(day, 14*cast(datediff(day, @StartDate, @FromDate) / 14 + 1 as int), @StartDate)
我需要做的是计算一年中的最后一个发薪日。如果我将@FromDate设置为2013年12月15日,这是可行的,但我不相信在12月是三个支票月的情况下,我可以依赖它。我的偏好是将FromDate设置为12/01/YYYY,并获得该年的最后一个发薪日,但我似乎不知道如何实现这一点

我需要如何更改此项才能获得今年的最后一个发薪日(始终是星期五)


提前感谢您即将提出的建议。

这可以通过一个简单的方法轻松完成。使用链接中的示例,查询如下所示:

SELECT TOP 1 [Date] FROM DimDate 
WHERE DATEPART(dw, [Date]) = 6 --is Friday
    AND DATEPART(wk, [Date]) % 2 = 0--Is an even week
    AND YEAR([Date]) = YEAR(getdate())--Current year
ORDER BY [Date] DESC

一年有52周。假设其中一个是双周支付的,就像这里的情况一样,您可以在开始日期的基础上再加50周,以获得一年中的最后一个日期

declare @StartDate datetime = '1/4/13'
declare @FromDate datetime = '12/15/' + cast(year(getdate()) - 1 as char(4))

select dateadd(week, 50, @StartDate)

set @StartDate = '1/3/14'

select dateadd(week, 50, @StartDate)

第一个结果是2013年12月20日。第二个结果是2014年12月19日。

考虑到它将始终是一年中的最后一个星期五或倒数第二个星期五,这应该是可行的:

declare @startdate datetime='20140110'
declare @lastdayofyear datetime='20141231'
select 
case datediff(WEEK,@startdate,dateadd(day,6-datepart(w,@lastdayofyear)-7,@lastdayofyear)) % 2
when 0 then
dateadd(day,datepart(w,6-@lastdayofyear)-7,@lastdayofyear)
else
dateadd(day,datepart(w,6-@lastdayofyear)-14,@lastdayofyear)
end

你知道你可以使用
DATEADD(wk,@N,@FixedDate)
找到一个在@FixedDate之后@N周的日期,对吗?对@N使用52的倍数不是很有效吗?然后从你固定日期的年差计算出来。日期!2013年1月3日=2013-03-01还是2013-01-03?我希望这是一个发薪日,这是一个星期五,因此是2013-03-01,但是你说“12/20/2013”,这显然是一个mm/dd/yyyy日期???Turophile,你说得对。谢谢我从2013年到2014年一直在翻身。1/4/13和1/3/14是发薪日。我打错了,但代码框中的代码使用的是1/4/13。更好的做法是使用日历表存储所有日期以及附加到这些日期的特定于业务的信息,如发薪日、假期、会计年度等。这一点很好。我真的想给出一个使用简单日期列表的查询示例。事实上,
DATEPART
YEAR
函数在这里是不必要的,因为链接中的表也会将这些值插入列中,但我认为使用内置函数会给出一个更好的例子。2016年失败,有53个星期五。这个方法返回51stI,除非你每4年考虑27个两星期,否则我不认为这个方法有效。Jayvee,我喜欢这个方法,但它给我的是12/22,这是一个星期二。我会玩这个,看看我是否可以按摩它,或者让它屈服。只是改变了一周的决定(在一年的最后一天之后转到下周五,然后减去一周)Jayvee,也许我只是太迟钝了,但我无法让这个代码工作。我以各种方式操纵了它,我总是得到错误的日期。我星期二有空。好吧,我不知道为什么,但换成这个给了我正确的日期。。。dateadd(day,datepart(w,2-@lastdayofyear)-7,@lastdayofyear)