2013-01-23 33 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

相关问题