2017-04-26 63 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點左右開始,那麼我應該完成它。感謝您的反饋 –