Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果另一个时间戳不在此范围内,ORACLE SQL将显示所有日期/时间范围_Sql_Oracle_Date Range - Fatal编程技术网

如果另一个时间戳不在此范围内,ORACLE SQL将显示所有日期/时间范围

如果另一个时间戳不在此范围内,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

一个具有不同时间戳的表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 <--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;