2017-04-26 64 views
0

在我的追求,以构建能够计算在X个工作日内我碰到这个功能附带的日期函数:添加工作日内迄今为止

ALTER FUNCTION [dbo].[AddBusinessDays] (@Date date,@n INT) 
RETURNS DATE AS BEGIN 
DECLARE @d INT; 
SET @d=4-SIGN(@n)*(4-DATEPART(DW,@Date)); 
RETURN DATEADD(D,@n+((ABS(@n)[email protected])/5)*2*SIGN(@n)[email protected]/7,@Date) END 

此功能,但是我需要将它与我的假期表链接以便它可以省略我国的特定假期。当我在今天的日期(26-04-2017)运行它时,我会在24-05-2017的20个工作日后得到这个日期,所以它只在周末时省略。我如何修改它,以便它也跳过节假日? 道歉,如果我发送一个问题太多的请求。我是一名SQL初学者。谢谢

+0

你在哪里指定假期或是指? –

+0

你可以发表一些输入和预期输出的例子,显示你的假期表吗? –

+4

使用日历表来避免这些难以读取和维护计算。 –

回答

0

而不是依靠难以理解的计算不明确地有你的工作日期,并从那里选择更容易?例如:

DECLARE @NthWorkingDay INT = 33; 

DECLARE @holidays TABLE 
    (
     holiday DATE , 
     [description] VARCHAR(500) 
    ); 
INSERT @holidays 
     (holiday, description) 
VALUES ('20170519', '...'), 
     ('20170501', '...'), 
     ('20170611', '...'), 
     ('20170704', '...'); 


DECLARE @sunday INT , 
    @saturday INT; 
-- 1/1/2000 is a known date - Saturday 

SET @saturday = DATEPART(WEEKDAY, DATEFROMPARTS(2000, 1, 1)); 
SET @sunday = DATEPART(WEEKDAY, DATEFROMPARTS(2000, 1, 2)); 

WITH tally 
      AS (SELECT TOP 5000 
         ROW_NUMBER() OVER (ORDER BY t1.object_id) AS N 
       FROM  master.sys.all_columns t1 
         CROSS JOIN master.sys.all_columns t2 
      ), 
     dates (theDate) 
      AS (SELECT DATEADD(DAY, N - 1, CAST(GETDATE() AS DATE)) 
       FROM  tally 
      ), 
     workDates (workingDay, workingDate) 
      AS (SELECT ROW_NUMBER() OVER (ORDER BY theDate) , 
         theDate 
       FROM  dates 
       WHERE DATEPART(WEEKDAY, theDate) NOT IN (@saturday, @sunday) 
         AND theDate NOT IN (SELECT holiday 
              FROM @holidays) 
      ) 
    SELECT workingDate 
    FROM workDates 
    WHERE workingDay = @NthWorkingDay; 
+0

这不会工作,因为我有很多很多数据要通过。 –

+0

我不明白你的意思是“这不行......很多很多......”。上半部分只是您的数据的一个样本,您可以简单地使用您的数据。 –

+0

我已经决定使用我与我的同事一起创建的其他功能,但需要很长时间,但是我认为如果它可以在午夜12点左右开始,那么我应该完成它。感谢您的反馈 –