2

一张不同时间戳的表DT:

约会时间

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

另一个带有开始日期和结束日期的表 TIMEFRAMES:

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 表中的所有行,除了那些来自 DT 表的任何时间戳(date_time)不落在表 TIMEFRAMES 的时间范围之间的行

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

4

3 回答 3

3

尝试:

select * from timeframes f where not exists
(select 1 from dt where dt.date_time between f.sdt and f.edt)
于 2013-01-23T14:39:40.533 回答
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

于 2013-01-23T14:47:23.703 回答
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 都在范围内。

于 2013-01-23T14:36:41.287 回答