在SQL查询中澄清

时间:2013-06-04 02:46:46

标签: sql oracle sybase

我澄清了我想要查询的方式。

我想要获取特定时间范围内的记录。

我在 A 表中有一条记录,其开始时间为 1900-01-01 21:00:00.0 ,结束时间为 1900-01- 01 22:00:00.0

我还有另一张 B 表,其中startTime为 1900-01-01 21:47:43.0 ,endTime为 1900-01-01 21 :47:48.0

现在我的任务是查找表A中包含表B的startTime和endTime的所有条目。

最初我用如下查询:

select *
from A
where startTime between '1900-01-01 21:47:43.0' and '1900-01-01 21:47:48.0'

我没有结果。

然后我尝试了以下查询

select *
from A
where startTime < '1900-01-01 21:47:43.0' and startTime > '1900-01-01 21:47:48.0'

我有一排。

在表A中我的范围如下:

1900-01-01 21:00:00.0 - 1900-01-01 22:00:00.0
1900-01-01 22:00:00.0 - 1900-01-01 23:00:00.0
1900-01-01 23:00:00.0 - 1900-01-01 23:30:00.0
.
.
.

等等。

在表B中,我有行start和endTimes,如

1900-01-01 21:27:30.0 - 1900-01-01 21:27:55.0
1900-01-01 22:11:22.0 - 1900-01-01 22:11:44.0
1900-01-01 23:22:11.0 - 1900-01-01 23:22:55.0
.
.
.
and so on.

我必须从表B中获取startTime和endTime并匹配表A中的插槽并获得结果。

我的第一种查询方式是正确的,还是第二种方式正确,还是有其他方法可以做到这一点。

修改

由于我们试图找到表A中存在范围的记录,我试图使用B的开始和结束时间如下:

select *
    from A
        and '1900-01-01 21:47:43.0' between startTime and endTime
        and '1900-01-01 21:47:48.0' between startTime and endTime

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用BETWEEN加入表格

SELECT A.*
FROM A
JOIN B
ON b.start_time BETWEEN a.start_time AND a.end_time
AND b.end_time BETWEEN a.start_time AND a.end_time

这将返回A中的所有内容,其中B的开始和结束时间都被A中的范围封装。

你的第二个查询看起来不太正确,因为你正在比较双方的start_time,但这个想法与此相似:

SELECT A.*
FROM A
JOIN B
ON a.start_time < b.start_time
AND a.end_time > b.end_time

任何一个查询都应该返回A的范围,该范围封装了B的开始时间。