4

ここで私のSQLFiddleをチェックしてください(リンク

SQL Server 2008には、次の画像のように、イベントの開始時刻と終了時刻のテーブルがあります。

ここに画像の説明を入力してください

各イベントのどれだけがどの勤務シフトに該当したかを把握できるクエリを作成する必要があります。私たちのシフトは12時間の長さで、06:00-18:00と18:00-06:00に行きます。

クエリは、次の画像のような結果を生成するはずです。

ここに画像の説明を入力してください

それから、特定の勤務シフトの合計イベント期間を把握できます。

最初の画像から2番目の画像に移動するにはどうすればよいですか?

4

1 に答える 1

8
With Shifts As
  (
    Select 1 As Num
      , Cast('2012-05-01 6:00 AM' As datetime) As ShiftStart
      , DateAdd(hh,12,Cast('2012-05-01 6:00 AM' As datetime)) As ShiftEnd
    Union All
    Select Num + 1, ShiftEnd, DateAdd(hh,12,ShiftEnd)
    From Shifts
    Where ShiftEnd < '2012-05-30'
    )
  , Segments As
    (
    Select event_id
      , Case 
        When Shifts.ShiftStart > event_start Then Shifts.ShiftStart 
        Else event_start
        End As start_split_segment        
      , Case 
        When Shifts.ShiftEnd < event_end Then Shifts.ShiftEnd
        Else event_end
        End As end_split_segment          
      , Count(*) Over ( Partition By E.event_id ) As SegmentCount
    From events As E
      Join Shifts
        On E.event_start <= ShiftEnd
          And E.event_end > ShiftStart
      )
Select E.event_id, E.description, E.event_start, E.event_end
  , S.start_split_segment, S.end_split_segment
  , Case When SegmentCount > 1 Then 1 Else 0 End As is_split
  , NullIf(SegmentCount,1) As split_segments
From Segments As S
  Join events As E
    On E.event_id = S.event_id

SQLフィドルバージョン

このソリューションでは、すべてのシフトの開始日と終了日のカレンダーを生成しました。Where ShiftEnd < '2012-05-30'より大きな日付に変更することで、カレンダーを拡張できます。Option(Maxrecursion 0);シフトが50を超える場合は、クエリの最後に追加してSQLServerの上限を引き上げることをお勧めします。

于 2012-05-30T04:02:18.657 に答える