2012-10-30 72 views
0

我有一個定義的作業時間的第一個表:FreeTimes table (start datetime, end datetime)和第二表與已計劃任務:TaskTime table (start datetime, end datetime)在T-SQL減去日期時間間隔

我需要以某種方式從第一減去第二表,所以我得到一個結果集remainig FreeTimes的此條件下進行:

  • 在情況下TaskTime(或更多TaskTimes)是在休閒時光的中間,我需要任務之後的任務和時間ramaining
  • 萬一當TaskTime被重疊整個休閒時光之前休閒時光被劃分到時刻i需要過濾掉此休閒時光
  • 在情況下TaskTime與休閒時光相交我需要從休閒時光減去TaskTime和離開只剩下FreeTime的一部分
+1

大概,更復雜的情況也是可能的(例如,FreeTime被多個TaskTimes重疊...) –

+0

你不能找到DATEDIFF(分鐘,FreeTimes.start,FreeTimes。結束) - DATEDIFF(分鐘,TaskTime.start,TaskTime.end)?然後,您可以根據需要的列進行分組,以便在特定日期爲當天或員工查找。 – Farfarak

+0

@ 010001100110000101110010011010我需要作爲結果記錄的開始和結束日期時間的時間間隔,不僅是白天的免費分鐘數的總和。 – isevcik

回答

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重疊行,你可能最終與多個間隔彼此相鄰)

+0

看起來不錯,但這也會返回空閒時間之間的差距,例如。當空閒時間是整個星期一和星期三,這個返回星期二(差距)結果 – isevcik

+0

@fanosek - 我知道我錯過了一些東西。您可以在最後一個查詢中添加第二個「存在」檢查。我會編輯它。 –