【发布时间】:2017-01-26 20:20:19
【问题描述】:
我正在处理与特定工作日数相关联的优先级列表的情况。
例如,如果我今天的日期为 2017-01-26,并且需要向其添加 5 个工作日,它将返回 2017-02-02。
为了混合一些附加功能,我有一个需要排除的公司定义的假期表。如果我从2017-02-16 中选择5 工作日,它将看到美国总统日落在2017-02-20 并会跳过它,使5th 工作日2017-02-24。
我在 SO 上找到了另一个示例,我正在尝试适应我的需求。问题是,我不完全知道发生了什么,只是我的添加没有达到我的预期。
参考帖: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
我不确定原始代码 sn-p 中发生了什么会阻止我将默认 10 days 增加到我的 30+ 天数。
有什么想法可以适应我的用例吗?
【问题讨论】:
-
为什么不创建一个日历表并做这样的事情呢? mssqltips.com/sqlservertip/4054/…
标签: sql-server tsql stored-procedures sql-server-2012 user-defined-functions