【发布时间】:2011-05-12 15:52:23
【问题描述】:
在 SO 上的答案的帮助下,我创建了一个 SQL Server UDF(如下),它返回下一个工作日(工作日),给定日期和要添加的天数。
例如,如果日期是星期五,并且您想添加一天,则返回值是下一个星期一的值。
这依赖于假设 @@DATEFIRST 设置为 1(星期一),因为我们无法在 UDF 中显式设置 DATEFIRST。
我的问题是我想在多台服务器上部署此功能,但它们有不同的@@DATEFIRST 设置,并且出于生产、测试和开发服务器之间的维护目的,我宁愿只拥有一个无需运行的功能担心正在使用哪个@@DATEFIRST 设置。我已经花了太长时间想知道为什么我在不同的环境中得到不同的结果!
如果答案只是“使用存储过程”,那么就足够公平了。
但是,如果有人可以建议如何将以下内容重构为独立于 DATEFIRST 设置,那就太好了。重要的线路可能是if DatePart(dw, @toDate) not in (6, 7)...
函数定义:
CREATE FUNCTION [dbo].[fn_AddBusinessDays]
(
@fromDate datetime,
@daysToAdd int
)
RETURNS datetime
AS
BEGIN
DECLARE @toDate datetime
DECLARE @daysAdded integer
-- add the days, ignoring weekends (i.e. add working days)
set @daysAdded = 1
set @toDate = @fromDate
while @daysAdded <= @daysToAdd
begin
-- add a day to the to date
set @toDate = DateAdd(day, 1, @toDate)
-- only move on a day if we've hit a week day
if DatePart(dw, @toDate) not in (6, 7)
begin
set @daysAdded = @daysAdded + 1
end
end
RETURN @toDate
END
【问题讨论】:
标签: sql-server user-defined-functions