sql >> データベース >  >> RDS >> Sqlserver

SQL Server で週末 (月曜日から金曜日) を除く日数を計算する

    カレンダー テーブル の場合、次のように簡単に使用できます:

    SELECT  COUNT(*)
    FROM    dbo.CalendarTable
    WHERE   IsWorkingDay = 1
    AND     [Date] > @StartDate
    AND     [Date] <= @EndDate;
      

    たとえば、SQL は国民の祝日を認識しないため、2 つの日付の間の平日の日数は、必ずしも稼働日数を表すとは限りません。これが、ほとんどのデータベースでカレンダー テーブルが必須である理由です。それらは多くのメモリを必要とせず、多くのクエリを簡素化します。

    しかし、これがオプションでない場合は、その場で比較的簡単に日付のテーブルを生成して、これを使用できます

    SET DATEFIRST 1;
    DECLARE @StartDate DATETIME = '20131103', 
            @EndDate DATETIME = '20131104';
    
    -- GENERATE A LIST OF ALL DATES BETWEEN THE START DATE AND THE END DATE
    WITH AllDates AS
    (   SELECT  TOP (DATEDIFF(DAY, @StartDate, @EndDate))
                D = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.Object_ID), @StartDate)
        FROM    sys.all_objects a
                CROSS JOIN sys.all_objects b
    )
    SELECT  WeekDays = COUNT(*)
    FROM    AllDates
    WHERE   DATEPART(WEEKDAY, D) NOT IN (6, 7);
      

    編集

    2 つの日付列の差を計算する必要がある場合でも、カレンダー テーブルをそのまま使用できます。

    SELECT  t.ID,
            t.Date1,
            t.Date2,
            WorkingDays = COUNT(c.DateKey)
    FROM    TestTable t
            LEFT JOIN dbo.Calendar c
                ON c.DateKey >= t.Date1
                AND c.DateKey < t.Date2
                AND c.IsWorkingDay = 1
    GROUP BY t.ID, t.Date1, t.Date2;
      

    SQL-Fiddle の例



    1. .NETプロジェクトをアンマネージドからマネージドODP.NETアセンブリに切り替える際の問題

    2. java.sql.SQLException:IO例外:ネットワークアダプタが接続を確立できませんでしたか?

    3. オラクルのIN関数へのコンマ区切り値

    4. AWSDatapipeline-アクセント付き文字の問題