2つの日付間の就業日の差を計算する必要があります。SQL Serverにこのための組み込み関数はありますか?誰かがこれを行う方法の例を提供できますか?
3 に答える
これが私がすぐに書いたものです。関数または必要なものにカプセル化するだけです。
declare @StartDate datetime
declare @EndDate datetime
declare @TotalDiff int
declare @NumberOfWeekends int
SET @StartDate = '3/12/2013'
SET @EndDate = '3/22/2013'
SET @NumberOfWeekends = 0
SET @TotalDiff = DATEDIFF(d,@StartDate, @EndDate)
If @TotalDiff > 7
SET @NumberOfWeekends = @TotalDiff / 7
else if DATEPART(dd, @EndDate) < DATEPART(DD, @StartDate)
SET @NumberOfWeekends = 1
select (@TotalDiff - 2*@NumberOfWeekends) as TotalWorkDays
いいえ、2つの日付の間の稼働日数を直接提供するSQL Serverには何も組み込まれていませんが、1つを作成できる組み込み関数がいくつかあります。
まず、いくつかの注意点があります
世界は「労働日」が何であるかについて同意することはできません。私たちのほとんどにとって、それは土曜日と日曜日です。中東のほとんどでは、金曜日と土曜日です(日曜日は通常の営業日です)
世界は、ほとんどの場合、休業日と見なされる祝日を構成するものについて合意することはできません。
これらのケースをどのように処理するかを指定していないので、いくつかの仮定を立てましょう。
- 土曜日と日曜日は休業日となります
- 祝日は考慮されません
@date
これで、次のタイプを指定すると、SQLで特定の日が土曜日か日曜日かを簡単に判断できますDateTime
。
IF DATENAME(dw,@date) IN ('Saturday','Sunday')
そのことを念頭に置いて、開始日と終了日を指定すると、@startDate
から@endDate
DECLARE @startDate DATETIME = '2013-01-01'
DECLARE @endDate DATETIME = '2013-01-20'
DECLARE @currDate DATETIME = @startDate
DECLARE @numDays INT = 0
WHILE @currDate<@endDate
BEGIN
IF DATENAME(dw,@currDate) NOT IN ('Saturday','Sunday')
SET @numDays = @numDays + 1
SET @currDate = DATEADD(day,1,@currDate)
END
SELECT @numDays
注:これは包括的ではないため、カウントされません@endDate
。WHILE @currDate<@endDate
次のように変更することで、包括的に変更できます。WHILE @currDate<=@endDate
私のソリューションは@EndDateをカウントしないので、それを変更する必要がある場合は、@d2に1を追加するだけです。
最初に、「最初の」日(たまたま月曜日の1/1/1900)から@StartDateおよび@EndDateまでの日数を計算します。
DECLARE @d1 int = DATEDIFF(Day, 0, @StartDate);
DECLARE @d2 int = DATEDIFF(Day, 0, @EndDate);
その場合、@StartDateと@EndDateの間の合計日数は次のようになります。
@d2 - @d1
これから、間隔内の日曜日の数と土曜日の数を差し引きます。それぞれ、合計日数と同様の差として計算されますが、現在は1週間(7日)です。週数を取得するには、7による整数除算と、「最初の」日(0)が月曜日であるという事実を使用します。間隔内の日曜日の数は
@d2/7 - @d1/7
土曜日の数は
(@d2+1)/7 - (@d1+1)/7
すべてをまとめると、私の解決策は次のとおりです。
DECLARE @StartDate DATETIME = '20180101'
DECLARE @EndDate DATETIME = '20180201'
DECLARE @d1 int = DATEDIFF(Day, 0, @StartDate)
DECLARE @d2 int = DATEDIFF(Day, 0, @EndDate)
SELECT @d2 - @d1 - (@d2/7 - @d1/7) - ((@d2+1)/7 - (@d1+1)/7) AS workdays