2016-08-08 19 views
-1

SQL Server 2012に作業日のみを計算する関数はありますか?SQL Server 2012のNetWorkDaysファンクション

私はこれまで検索してきましたが、今まで運がありませんでした。

ありがとうございます!

+0

※*の国及び会社*の労働日は? –

+0

週末は金曜日と土曜日です。ありがとう! – user2597012

+1

[2つの日付間の作業日数をカウントする]の可能性のある複製(0120-18752) –

答えて

0

いいえ、SQL Serverは、このような機能を持っていませんが、カレンダーのテーブルを使用することができます。

DECLARE @date_start date = '2016-01-01', 
     @date_end date = '2016-12-31'; 

WITH cte as (
SELECT @date_start as [d], 0 as Level 
UNION ALL 
SELECT DATEADD(day,1,[d]), [level] + 1 as [level] 
from cte 
WHERE [level] < DATEDIFF(day,@date_start,@date_end) 
), 

holidays as (--table with holidays (USA) 
SELECT * FROM (VALUES 
('2016-01-01'), 
('2016-01-18'), 
('2016-02-15'), 
('2016-05-30'), 
('2016-07-04'), 
('2016-09-05'), 
('2016-10-10'), 
('2016-11-11'), 
('2016-11-24'), 
('2016-12-26')) as t(d) 
) 

SELECT c.d, 
     CASE WHEN DATEPART(WEEKDAY,c.d) IN (1,7) THEN 0 --Saturday and Sunday, use (6,7) for Friday,Saturday 
      WHEN h.d IS NOT NULL THEN 0 
      ELSE 1 END as isWorking 
FROM cte c 
LEFT JOIN holidays h 
    ON c.d=h.d 
OPTION (MAXRECURSION 1000); 

それは2016年とフラグのすべての日付を持つテーブルを生成します - 日が仕事やされていません。以下は

0

は、あなたがこれを行うことができる方法の高レベルの概要..です

この形式で日付を保持しているダミーのテーブルを作成します...

date  isholiday 
20160101 1 
20160102 0 

従業員を保持しているあなたのメインテーブルから出席は、このスクリプトは、土曜日、日曜日及び祝日を除く総労働日数を計算します。..

select empid,sum(Case when mt.datee is not null then 1 else 0 end) as workingdays 
from 
dummydatees dt 
left join 
maintable mt 
on dt.datee=mt.datee 
where dt.isholiday=0 
0

のようにテーブルの上に参加します。私は休日のためのテーブルを持っていないので、私はすべての休日を一覧表示する必要があります。要件を満たすように変更することができます。

DECLARE @MyCounter int = 0, @TempDate datetime, @EndDate datetime; 
SET @TempDate = DATEADD(d,1,'2017-5-27') 
SET @EndDate = '2017-6-3' 

WHILE @TempDate <= @EndDate 
    BEGIN 
    IF DATENAME(DW,@TempDate) = 'Sunday' OR DATENAME(DW,@TempDate) = 'Saturday' 
     SET @MyCounter = @MyCounter 
    ELSE IF @TempDate not in ('2017-1-1', '2017-1-16', '2017-2-20', '2017-5-29', '2017-7-4', '2017-9-4', '2017-10-9', '2017-11-11', '2017-12-25') 
     SET @MyCounter = @MyCounter + 1 

    SET @TempDate = DATEADD(d,1,@TempDate) 
    CONTINUE 

END 
PRINT @MyCounter 
PRINT @TempDate