我已经看到许多关于如何创建 SQL Server 函数的帖子,该函数将给日期添加给定的工作日数。但是,他们都没有完全按照我需要的方式计算。我们有一个当前在代码中完成的函数,但我想转移到 native SQL Server 函数(供存储过程和查询使用)。在开始评估仓储费用之前,我们会给客户 5 个工作日的时间来取货。 5 个工作日不包括周末和节假日(我们有一张包含节假日日期的表格)。这里的诀窍是,无论是周末还是假期,我都需要在 5 个工作日后立即获取日期。所以我需要函数来返回最后一个工作日期,而不是之后的第一个工作日。因此,例如:
Oct 20th (Sat) plus 5 working days = Oct 26th (Fri)
Oct 21st (Sun) plus 5 working days = Oct 26th (Fri)
Oct 22nd (Mon) plus 5 working days = Oct 29th (Mon)
May 19th (Sat) plus 5 working days with May 21st a holiday = May 28th
5 个工作日是当前分配,但这可能会在 future 发生变化,因此工作日数需要作为参数。此外,该函数可用于相当大的数据集,因此我更愿意在没有循环的情况下执行此操作。我们正在运行 SQL Server 2008。
编辑:这不是“Add business days to date in SQL without loops”的重复,因为他们希望结束日期是工作日。我希望我的结束日期是紧随最后一个宽限日之后的任何日期(即:周一到周五的 5 个工作日我希望返回周六日期,而不是下一个周一)。
最佳答案
create table holidays (
date date);
GO
create function dbo.findWorkDayAfter(@date datetime, @days int)
returns date as
begin
return (
select thedate
from (
select thedate=dateadd(d,v.day,cast(@date as date)),
rn=row_number() over (order by v.day)
from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))v(day)
left join holidays h on h.date = dateadd(d,v.day,cast(@date as date))
where h.date is null and left(datename(dw,dateadd(d,v.day,cast(@date as date))),1) <> 'S'
) x
where @days = rn
)
end
GO
除非你有长假期,10天应该足以找到下一个工作日。如果需要,请增加它。
如果您需要从某个日期起计算更多工作日,您可以使用它来满足一年或三年的需求。
alter function dbo.findWorkDayAfter(@date datetime, @days int)
returns date as
begin
return (
select thedate
from (
select thedate=dateadd(d,v.number,cast(@date as date)),
rn=row_number() over (order by v.number)
from master..spt_values v
left join holidays h on h.date = dateadd(d,v.number,cast(@date as date))
where h.date is null and left(datename(dw,dateadd(d,v.number,cast(@date as date))),1) <> 'S'
and v.number >= 1 and v.type='p'
) x
where @days = rn
)
end
GO
关于sql-server - 将工作日添加到日期的 SQL Server 函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12862436/