2017-12-07 9 views
2

私は今年の祝日のリストを含むテーブルを持っています。さて、ここの就業日は月曜日〜土曜日です。だから、私は特定の間隔(年、月、週など)の作業日のリストを取得するような方法で私のクエリとの年次休暇テーブルをリンクしようとしています 私は土曜日年間休暇を引く(リンクする)ことはできません。営業日取得するための1か月の就業日とSQLの年間休日を組み合わせるにはどうすればよいですか?

コード:

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 
SET @StartDate = '2017-12-01 10:00:00.000' 
SET @EndDate = '2017-12-31 00:00:00.000' 


SELECT 
    (DATEDIFF(dd, @StartDate, @EndDate) + 1) 
    -(DATEDIFF(wk, @StartDate, @EndDate)) 
    -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) AS WorkingDays 

テーブルAnnualHolidaysは、レイアウトを持っています

Id     Date        Description 
----------- -----------------------    ------------------- 
50   2017-10-21 00:00:00.000     Holiday 1 
49   2017-10-20 00:00:00.000     Holiday 2 

だから、私は@StartDateの間隔で来年次休暇を引くことができますどのような方法がありますと@EndDate私は特定の間隔の実際の作業日を得ることができるように

答えて

1

有効な範囲を消去し、休日を減算して結果を数えてください。私は、日付範囲の再帰関数を使用していますが、moreこれは、より大きな範囲でより効果的なことを行う方法があります。

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 
SET @StartDate = '2017-12-01 10:00:00.000' 
SET @EndDate = '2017-12-31 00:00:00.000' 


;WITH Dates AS (
     SELECT 
      [Date] = @StartDate 

     UNION ALL 

     SELECT 
      [Date] = DATEADD(DAY, 1, [Date]) 
     FROM 
      Dates 
     WHERE 
      Date <= @EndDate 
) 
SELECT COUNT(*) 
from 
(
    SELECT 
     [Date] 
    FROM 
     Dates 
    WHERE 
     DATENAME(dw, [Date]) != 'Sunday' 

    EXCEPT 

    select 
     [Date] 
    from        
     AnnualHolidays 
) tbl 
+0

何らかの理由により、年次休暇が減算されません。日曜日は削除されていますが、毎年の休日は削除されていない就業日が表示されます。 –

+0

それを有効にすることはできましたか? '... not in(日付を選択してください:AnnualHolidays)'を実行することもできます – Magnus

関連する問題