我可以通过以下方式计算未来的支付日期,因为知道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并获得当年的最后一个发薪日,但我似乎无法理解如何解决这个问题。
如何更改此项以获得当年的最后一个发薪日(总是一个星期五)?
提前感谢即将提出的建议。
答案 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日。