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

休日を除く 2 つの日付間の営業日数を取得する SQL Server クエリ

    create table MyTable
    (
     start_date date not null,
     end_date date not null,
     code int not null
    )
    GO
    
    create table HolidayDates
    (
       holydayDate date not null,
       holydayDescription varchar(100) not null
    )
    GO
    
    insert into MyTable
    values
     ('2018-12-25','2019-01-01',101)
    ,('2018-12-01','2019-01-31',102)
    ,('2018-12-24','2019-01-02',103)
    GO
    
    insert into HolidayDates
    values
     ('2018-12-25', 'xmas')
    ,('2019-01-01', 'Reveillon')
    GO
    

    以下のクエリでは、列がどのように計算されるかを確認できます。

    [休日 (週末ではない)]: テーブルからすべての祝祭日を取得しても、週末ではありません (したがって、2 回カウントされません)。

    週末: 期間中の週末を取得します。

    列の残りの部分は一目瞭然です

    免責事項 、これを少し単純化できます。これは、使用方法のクエリの例にすぎません

    DATEPART

    DATEDIFF

    DATNAME

    select 
      datediff(day, mt.start_date, mt.end_date) as [total days], 
      (
        select 
          count(*) 
        from 
          HolidayDates hd 
        where 
          hd.holydayDate between mt.start_date 
          and mt.end_date 
          and DATEPART(WEEKDAY, hd.holydayDate) between 2 
          and 6
      ) as [holydays (not weekends) ], 
      (
        select 
          (
            datediff(wk, mt.start_date, mt.end_date) * 2
          ) +(
            case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
          ) +(
            case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
          )
      ) as weekends, 
      case when datediff(day, mt.start_date, mt.end_date) -(
        select 
          (
            datediff(wk, mt.start_date, mt.end_date) * 2
          ) +(
            case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
          ) +(
            case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
          )
      ) -(
        select 
          count(*) 
        from 
          HolidayDates hd 
        where 
          hd.holydayDate between mt.start_date 
          and mt.end_date 
          and DATEPART(WEEKDAY, hd.holydayDate) between 2 
          and 6
      ) > 3 then 0 --> this need to exclude weekend and holidays
      when mt.code = 1 then 1 when mt.code = 2 then 2 else 3 end as mycolumn 
    from 
      MyTable mt
    

    返品

    total days  holydays (not weekends) weekends    mycolumn
    ----------- ----------------------- ----------- -----------
    7           2                       2           3
    61          2                       18          0
    9           2                       2           0
    
    (3 row(s) affected)
    



    1. PHPPDOすべてのクエリにフィルターを追加

    2. 2つ以上の日付範囲を1つにマージする方法

    3. データファイルとStatisticaのマージ、パート1

    4. JOINの後にDISTINCT値を選択します