2017-07-30 52 views
0

我有一張桌子,有時間條目有開始和結束時間。我想獲得表格中沒有的時間條目。如何獲得SQL Server中沒有發生時間差距?

例如:我有時間輸入,開始時間爲08.00 - 09.00,其他爲10.20 - 11.00。我需要一個包含09.00 - 10.19的記錄。由於我需要爲多次出現做這件事,任何人都可以幫我找到這個複雜的查詢嗎?

enter image description here

我有一個時間範圍,以顯示非發生的歷史條目高炮07:00到17:00之間,那麼它應該7.00回到我8.45和14.00到17.00

+0

你能分享你正在使用的模式嗎? – driis

+0

我看到這個工作最簡單的方法是使用CTE將當天的每一分鐘放在一個列中,然後將它與您的條目表結合起來,以便找出哪些分鐘「被採納」,哪些不是,過濾出「採取」 「的人,然後分組的其餘的間隔:) –

+0

https://stackoverflow.com/questions/20980891/how-to-write-recursive-cte-in-sql-server-2012-for-hour-and-min可能是一個很好的開始的地方,只需要一分鐘的時間間隔 –

回答

0

我缺乏信譽做評論(發表的意見米哈伊和TT是驚人的,有趣的),而是一個可能的解決方案可能是簡單的

SELECT a.endDT, Min(b.startDT) 
FROM sched a, sched b 
WHERE a.endDT<b.startDT 
GROUP BY a.endDT 

,將回報您的樣本數據

2017-07-30 08:45:00.000 2017-07-30 09:30:00.000 
2017-07-30 09:45:00.000 2017-07-30 10:30:00.000 
2017-07-30 11:45:00.000 2017-07-30 13:15:00.000 
2017-07-30 13:45:00.000 2017-07-30 14:00:00.000 

然而,正如Mihai和TT的評論所指出的那樣,從午夜到上午8點之間的這段時間,第一條記錄就沒有時間。

+0

它解決了概率,但在這裏情況有點不同我有時間激盪顯示不存在的條目beteen 07.00到17.00然後它應該返回我7.00到8.45和14.00到17.00 –

0

我不能告訴你的樣本數據與你的描述有什麼關係。但這個問題似乎可以通過lag()解決。對於您所提供的數據:

select activity, prev_endtime as gap_start, starttime as gap_end 
from (select t.*, 
      lag(endtime) over (partition by activity order by id) as prev_endtime 
     from t 
    ) t 
where starttime <> prev_endtime; 

我要指出,這將不會爲開始時間和結束時間所有可能的組合工作。但是,您的時間段看起來沒有重疊,它們似乎是按id排序的,所以這應該起作用。

+0

它解決了這個問題,但在這裏情況有點不同我我有一個時間激盪,以顯示沒有發生的條目17.00至17.00,然後它應該返回我7.00至8.45和14.00至17.00 –