我會解決這個問題的一般方法如下:
;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
重疊行,你可能最終與多個間隔彼此相鄰)
大概,更復雜的情況也是可能的(例如,FreeTime被多個TaskTimes重疊...) –
你不能找到DATEDIFF(分鐘,FreeTimes.start,FreeTimes。結束) - DATEDIFF(分鐘,TaskTime.start,TaskTime.end)?然後,您可以根據需要的列進行分組,以便在特定日期爲當天或員工查找。 – Farfarak
@ 010001100110000101110010011010我需要作爲結果記錄的開始和結束日期時間的時間間隔,不僅是白天的免費分鐘數的總和。 – isevcik