T-SQL获得当年的上周五发薪日

时间:2014-03-04 20:46:19

标签: 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, @FromDate) / 14 + 1 as int), @StartDate)

需要做什么,是计算一​​年中的最后一个发薪日。如果我将@FromDate设置为12/15/2013,这可行,但我不相信在12月是三个月的情况下我可以依赖它。我的偏好是将FromDate设置为12/01 / YYYY并获得当年的最后一个发薪日,但我似乎无法理解如何解决这个问题。

如何更改此项以获得当年的最后一个发薪日(总是一个星期五)?

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

3 个答案:

答案 0 :(得分:1)

这可以通过date dimension table相当容易地完成。使用链接中的示例,查询将如下所示:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

一年有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日。