我有一个函数,用来计算给定日期之前或之后的x个工作日数(不包括周末和假日)。
问题是,当最后一天落在一个周末或一个工作日,它不会增加额外的迭代.
SELECT afidb.dbo.AddBusinessDays(-21,'11/08/2016') 上面应该返回2016-10-7,但正在返回2016-10-10。10月10日是假日,而前两天是周末。
我认为这是因为在最后一次迭代中,@bdays = 0退出,不添加额外的步骤。
我是不是弄错了,还是还有别的问题呢?
ALTER FUNCTION [dbo].[Addbusinessdays] (
@bDays INT -- number of business days to add sub.
,@d DATETIME -- variable to hold the date you want to add or sub days to
)
RETURNS DATE
AS
BEGIN
DECLARE @nDate DATETIME -- the working date
,@addsub INT -- factor for add or sub
SET @ndate = @d
IF @bdays > 0
SET @addsub = 1
ELSE
SET @addsub = - 1
WHILE @bdays <> 0 -- Keep adding/subtracting a day until @bdays becomes 0
BEGIN
-- incr or decr @ndate
SELECT @bdays = CASE
WHEN (@@datefirst + Datepart(weekday, @ndate)) % 7 IN ( 0 ,1 ) -- ignore if it is Sat or Sunday
THEN CASE
WHEN @bDays = 0
THEN @bdays + 1 * @addsub
ELSE @bDays
END
WHEN (
SELECT Count(*)
FROM dbo.tblholidays
WHERE holidaydate = @nDate
) > 0
-- ignore if it is in the holiday table
THEN CASE
WHEN @bDays = 0
THEN @bdays + 1 * @addsub
ELSE @bDays
END
ELSE @bdays - 1 * @addsub -- incr or decr @ndate
END
SET @ndate = Dateadd(day, 1 * @addsub, @ndate)
END
RETURN Cast(@nDate AS DATE)
END发布于 2017-04-19 19:50:59
您需要在while循环结束时进行额外检查,以确保您不会在非营业日着陆。在设置了@ndate = Dateadd(day,1* @addsub,@ndate)之后,您必须再次检查@ndate。如果是非营业日,则增加或减少@bday,以便您再次进入循环。
https://stackoverflow.com/questions/43503979
复制相似问题