2013-01-23 72 views
2

一個表DT:ORACLE SQL顯示所有的日期/時間範圍,如果另一個時間戳不在這個範圍之間不同的時間戳下降

DATE_TIME

22/01/2013 22:30 
16/10/2012 11:20 
30/03/2012 20:50 

另一個表時限與開始日期和結束日期:

SDT      EDT 
22/01/2013 23:30  22/01/2013 23:40 
22/01/2013 20:30  22/01/2013 20:40 
22/01/2013 22:10 X 22/01/2013 22:40 <--should filtered out because 
              one of the timestamps(values from DT table) 
              is between SDT & EDT 
16/10/2012 11:00  16/10/2012 11:10 
16/10/2012 11:00 X 16/10/2012 11:40 <--should filtered out because 
              one of the timestamps(values from DT table) 
              is between SDT & EDT 

如此期望的結果將是來自TIMEFRAMES表的所有行exept那些行中的任何時間戳記(date_time)從DT表不從表中的時間週期之間墜入時限

SDT     EDT 
22/01/2013 23:30  22/01/2013 23:40 
22/01/2013 20:30  22/01/2013 20:40  
16/10/2012 11:00  16/10/2012 11:10 

http://www.sqlfiddle.com/#!4/340a8/3

+2

注意,在你的小提琴,最後時限記錄有從2013年SDT和2012年 –

+1

好點EDT ...應該是2012 ** [糾正小提琴](http://www.sqlfiddle.com/#!4/e03b5/4)** – user1875323

+0

酷!謝謝你的快速反應。 – user1875323

回答

0

您可以用左外做加盟,聚集:

select tf.sdt, tf.edt, COUNT(*), COUNT(dt.date_time) 
from timeframes tf left outer join 
    dt 
    on dt.date_time between tf.sdt and tf.edt 
group by tf.sdt, tf.edt 
having COUNT(*) <> COUNT(dt.date_time) 

having子句檢查是否所有的dts都在範圍內。

+0

我認爲你不需要這些數字。沒有任何dt.date_time值就足夠了。 –

3

嘗試:

select * from timeframes f where not exists 
(select 1 from dt where dt.date_time between f.sdt and f.edt) 
+1

+1是最好的,最具可讀性和最簡單的解決方案。始終保持簡單。 – Art

1
select sdt, edt 
from timeframes t 
left join dt on (dt.date_time between t.sdt and t.edt) 
where dt.date_time is null; 

sqlfiddle

相關問題