如果另一个时间戳不在此范围内,ORACLE SQL将显示所有日期/时间范围
一个具有不同时间戳的表DT: 日期和时间如果另一个时间戳不在此范围内,ORACLE SQL将显示所有日期/时间范围,sql,oracle,date-range,Sql,Oracle,Date Range,一个具有不同时间戳的表DT: 日期和时间 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 <--s
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
您可以使用左侧外部联接和聚合来完成此操作:
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)
选择tf.sdt、tf.edt、COUNT(*)、COUNT(日期和时间)
从时间范围tf左外联接
dt
在tf.sdt和tf.edt之间的dt.date\u时间
按tf.sdt、tf.edt分组
有计数(*)计数(日期和时间)
having子句正在检查所有dts是否都在范围内。您可以使用左外部联接和聚合来执行此操作:
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)
选择tf.sdt、tf.edt、COUNT(*)、COUNT(日期和时间)
从时间范围tf左外联接
dt
在tf.sdt和tf.edt之间的dt.date\u时间
按tf.sdt、tf.edt分组
有计数(*)计数(日期和时间)
having子句正在检查所有dts是否都在范围内。尝试:
select * from timeframes f where not exists
(select 1 from dt where dt.date_time between f.sdt and f.edt)
尝试:
请注意,在你的小提琴中,最终的时间表记录有2013年的SDT和2012年的EDT。这一点很好。。。应该是2012年。凉的感谢您的快速回复。请注意,在您的小提琴中,最终的时间表记录有2013年的SDT和2012年的EDT。好的观点。。。应该是2012年。凉的谢谢你的快速回复。我想你不需要这些计数。没有任何dt.date\u时间值就足够了。我认为您不需要这些计数。没有任何dt.date_time值就足够了。对于最佳、最可读和最简单的解决方案,只需+1即可。始终保持简单。+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;