0

定義された作業時間の最初のテーブルとFreeTimes table (start datetime, end datetime)、すでに計画されたタスクの2番目のテーブルがありますTaskTime table (start datetime, end datetime)

どういうわけか、最初のテーブルから2番目のテーブルを引く必要があるので、この条件下で残りのFreeTimesの結果セットを取得します。

  • TaskTime(またはそれ以上のTaskTimes)がFreeTimeの途中にある場合、FreeTimeをタスク前の時間とタスク後の残り時間に分割する必要があります
  • TaskTimeがFreeTime全体と重複している場合は、このFreeTimeを除外する必要があります
  • TaskTimeがFreeTimeと交差している場合、FreeTimeからTaskTimeを減算し、FreeTimeの一部のみを残す必要があります。
4

1 に答える 1

2

私がこれを解決する一般的な方法は次のとおりです。

;With AllTimes as (
    select [Start] as EventTime from FreeTimes
    union
    select [End] from FreeTimes
    union
    select [Start] from TaskTimes
    union
    select [End] from TaskTimes
), OrderedTimes as (
    select EventTime,ROW_NUMBER() OVER (ORDER BY EventTime) rn
    from AllTimes
), Intervals as (
    select
        ot1.EventTime as StartTime,
        ot2.EventTime as EndTime
    from
        OrderedTimes ot1
            inner join
        OrderedTimes ot2
            on
                ot1.rn = ot2.rn - 1
)
select * from Intervals i
where not exists (
    select * from TaskTimes T where --Overlapped
       T.[Start] < i.EndTime and
       T.[End] > i.StartTime)
and exists (
    select * from FreeTimes T where
       T.[Start] < i.EndTime and
       T.[End] > i.StartTime)

基本的に、関心のあるすべての日時値を並べ替えてから、連続する値の各ペアについて、TaskTimesテーブルとの重複があるかどうかを調べます。ある場合、そのペアは最終結果に含まれないはずです。(編集-区間ペアが実際に重複していることも確認する必要がありFreeTimesます)

必要に応じて、これをさらに進めて間隔をマージできます(に重複する行がある場合FreeTimes、互いに隣接する複数の間隔になる可能性があります)

于 2012-10-30T08:44:11.917 に答える