1

「休日テーブル」というテーブルがあります。このテーブルには、基本的に、従業員が仕事をしないすべての日(銀行の休日など)の日付が含まれています。

以下のクエリは、基本的に現在の会計年度を調べて、最初に月ごとに利用可能な日数を計算し、次にすべての累積でユニオンを使用します(たとえば、4月から5月、4月から6月)。これには非累積を使用できます。

クエリを参照してください:

DECLARE @StartDate DATETIME, 
        @EndDate   DATETIME 

        --available days            
--current – start of this financial year
SELECT @StartDate = (select
case when month(getdate()) >= 4 then
convert(datetime, cast(year(getdate()) as varchar) + '-4-1')
else
convert(datetime, cast(year(getdate())-1 as varchar) + '-4-1')
end), 

--current – end of this financial year
       @EndDate = (select
case when month(getdate()) < 4 then
convert(datetime, cast(year(getdate()) as varchar) + '-3-31')
else
convert(datetime, cast(year(getdate())+1 as varchar) + '-3-31')
end) 


CREATE TABLE #data 
  ( 
     firstday    DATETIME NOT NULL PRIMARY KEY, 
     workingdays INT NOT NULL 
  ); 

WITH dayscte ([Date]) 
     AS (SELECT @StartDate 
         UNION ALL 
         SELECT Dateadd(DAY, 1, [Date]) 
         FROM   dayscte 
         WHERE  [Date] <= @Enddate) 
INSERT INTO #data 
SELECT MIN([Date]), 
       COUNT(*) [Day] 


FROM   dayscte 
       LEFT JOIN dbo.Holiday_Table
         ON [Date] BETWEEN dbo.Holiday_Table.sch_cal_d AND dbo.Holiday_Table.sch_cal_ed 



where
NOT EXISTS (
    SELECT sch_id,sch_cal_d,sch_cal_ed FROM dbo.Holiday_Table WHERE 
    sch_id ='66291100Ks'
    AND
    [date] <= sch_cal_d  
    AND
    [date] >= sch_cal_ed  
    )
       AND Datename(weekday, [Date]) NOT IN ( 'Saturday', 'Sunday' ) 
GROUP  BY Datepart(MONTH, [Date]), 
          Datepart(YEAR, [Date]) 
OPTION (MAXRECURSION 366) 

DECLARE @Date DATETIME 

SET @Date = (SELECT MIN(firstday) 
             FROM   #data) 

SELECT Period, 
       workingdays [Days_Available_Minus_Holidays] ,

       year (firstday) AS [Year]


FROM   (SELECT Datename(MONTH, firstday) [Period], 
               workingdays, 
               0                         [SortField], 
               firstday 
        FROM   #data 


       UNION 
        SELECT Datename(MONTH, @Date) + '-' + Datename(MONTH, firstday), 
               (SELECT SUM(workingdays) 
                FROM   #data b 
                WHERE  b.firstday <= a.firstday ) [WorkingDays], 
               1                                 [SortField], 
               firstday 
        FROM   #data a 
        WHERE  

        firstday > @Date) data 

ORDER  BY sortfield, 
          firstday 

DROP TABLE #data  

GO

この結果は次のとおりです。

Period  Days_Available_Minus_Holidays   Year
April                     19    2012
May                   22    2012
June                      19    2012
July                      22    2012
August           22 2012
September            20 2012
October          23 2012
November             22 2012
December             19 2012
January          23 2013
February             20 2013
March                     21    2013
April                      1    2013
April-May            41 2012
April-June           60 2012
April-July           82 2012
April-August             104    2012
April-September 124 2012
April-October            147    2012
April-November  169 2012
April-December  188 2012
April-January            211    2013
April-February           231    2013
April-March          252    2013
April-April          253    2013

私の問題は、累積に達すると、別の「4月」を実行し、次に「4月から4月」を実行することです。4月の累積は1か月しかないため、基本的に最初の月は必要ありません。または、4月の最後の累積値が非累積値でカバーされている場合、または2番目の「4月」が留まらなければならない場合は、非累積値と同じである「1」を使用可能な日数として読み取ってはなりません。これは実際に利用可能な日数です。

4

1 に答える 1

3

WITH句のequalsを削除してみてください

WHERE [Date] <= @Enddateに変更WHERE [Date] < @Enddate

WHERE句の前の日付に1日を追加しているように見えるため、1日を超えています。

于 2012-05-18T08:36:34.260 に答える