0

特定の営業日に関連付けられた優先リストがある状況で作業しています。TSQL - 休日を除く現在の営業日を追加します。

たとえば、今日の日付が2017-01-26で、5営業日を追加する必要がある場合は、2017-02-02が返されます。

追加された機能をいくつか混在させるには、除外する必要がある会社定休日の表があります。 52017-02-16から選択すると、米国大統領の日は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 

私は私の30+日に彼らのデフォルト10 daysを高めることができることから私を妨げる元のコードスニペットでは何が起こっているのか正確にわかりません。

これが私のユースケースに合うようにどのように適応できるかについての考えはありますか?

+2

なぜカレンダーテーブルを作成し、このようなことをしないのですか? https://www.mssqltips。com/sqlservertip/4054/creation-date-dimension-or-calendar-table-in-sql-server / – dadde

答えて

0

私はこれを行うことによって、あなたのSPの内部を実行してみました:

DECLARE @holidays TABLE(holidayDate DATE); 
INSERT INTO @holidays 
     SELECT * 
     FROM(VALUES('20170103')) f(b); 
DECLARE @date DATETIME= '20170101', @days INT= 1; 

私は、これは、供給された日付から始まる、営業日の曜日を示していますインテリアselect文

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' 

を実行します@ date + 45日のカレンダー日付に最も近い営業日に終了します。 すべて祝日と週末はリストから削除されます。私が入力した値は、2017年1月1日から2月15日までの29営業日で、1月1日から45日後です。 これはあなたの問題です。あなたは35営業日を過ごしたいと思っていますが、次の45カレンダー日の多くの営業日。

これはコード内で何が起こり、なぜ失敗するのかを明確にしたいと考えています。 今すぐ簡単な修正は、より多くのカレンダーの日を楽しみにしています。 ここで私はこれがあなたに先駆け日、数千に行く可能性を提供します。日後に控え

SELECT DATEADD(d, v1.day+45*(v2.day-1)+45*45*(v3.day-1), CAST(@date AS DATE)) AS thedate, 
      ROW_NUMBER() OVER(ORDER BY v1.day+45*(v2.day-1)+45*45*(v3.day-1)) 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 v1(day) 
cross join  
     (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 v2(day) 
cross join  
     (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 v3(day) 
     LEFT OUTER JOIN @holidays AS h ON h.holidayDate = DATEADD(d, v1.day+45*(v2.day-1)+45*45*(v3.day-1), CAST(@date AS DATE)) 
    WHERE h.holidayDate IS NULL 
      AND LEFT(DATENAME(dw, DATEADD(d, v1.day+45*(v2.day-1)+45*45*(v3.day-1), CAST(@date AS DATE))), 1) <> 'S' 

45-1 *あなたの45日に3回参加交差し、1から45 * 45に実行中の合計を計算します最も洗練されたソリューションではないかもしれませんが、問題を解決するはずです。

関連する問題