我正在处理的情况是,我有一个优先级列表与特定数量的工作日相关联。TSQL - 增加营业日至日期,不包括节假日
例如,如果我今天的日期为2017-01-26
,需要增加5个工作日,则它将返回2017-02-02
。
要混合一些附加功能,我有一张公司定义的假期表,它需要排除。如果我从2017-02-16
中选择5
工作日,则会看到美国总统日落在2017-02-20
之后,并且会跳过该步骤,从而使5th
工作日2017-02-24
。
我发现了另一个这样的例子,我试图去适应我的需求。问题是,我不完全知道发生了什么,只是我的增加不会导致我期望的结果。
基准柱:https://stackoverflow.com/a/12862675/2628921
ALTER FUNCTION [dbo].[findBusinessDayAfter]
(@date DATETIME, @days INT)
RETURNS DATE
AS
BEGIN
RETURN (SELECT thedate
FROM (SELECT dateadd(d, v.day, CAST (@date AS DATE)) AS thedate,
row_number() OVER (ORDER BY v.day) AS rn
FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40)) AS v(day)
LEFT OUTER JOIN
holidays AS h
ON h.holidayDate = dateadd(d, v.day, CAST (@date AS DATE))
WHERE h.holidayDate IS NULL
AND LEFT(datename(dw, dateadd(d, v.day, CAST (@date AS DATE))), 1) <> 'S') AS x
WHERE @days = rn);
END
在给出的原始实例中,他们使用的是(1) - (10)
。但是,我有些情况下需要将35-40
个工作日添加到日期,因此我相应地调整了查询以允许我进入该日期。
我发现,当我尝试运行某些日期与工作日,它返回一个null
值,我不知道为什么。
-- Multiple Holidays (Day before Thanksgiving)
SELECT dbo.findBusinessDayAfter('2017-11-05', 35) -- Returns NULL
我并不确切知道什么是在原代码段会阻止我能够增加它们的默认10 days
我30+
天发生。
有关如何调整以适应我的用例的想法?
为什么不创建日历表并做这样的事情? HTTPS://www.mssqltips。COM/sqlservertip/4054 /创建-A-日期维度或日历表,在-SQL服务器/ – dadde