【问题标题】:Clarification in Sql QuerySql Query 中的说明
【发布时间】:2013-06-04 14:48:17
【问题描述】:

我已经澄清了我想查询的方式。

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

我在表 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 的 start 和 endTimes,如下所示:

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

【问题讨论】:

  • 这取决于您希望结果是什么,您是否希望两个表之间的开始时间和结束时间匹配?或者您想在 B 中查找表 A 范围内的记录?
  • @Goat_CO:我想要表 A 上的所有记录,它封装了表 B 中记录的 startTime 和 endTime。在这种情况下,我该怎么做。
  • 这很令人困惑,因为在您问题的顶部,您显示的 A 的值与底部的 A 值不同,而顶部的 B 值与 B 的值不同底部。
  • @Goat_co:很抱歉我把值弄混了。我已经更正了这些值。那么如何找到表 A 上的所有记录,它封装了表 B 中记录的 startTime 和 endTime。在这种情况下,我该怎么做。

标签: sql oracle sybase


【解决方案1】:

我认为最简单的方法是使用 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 的开始结束时间。

【讨论】:

  • 感谢您的回复。在这里,您的第二个查询返回一行,但您加入 2 个表的第一个查询不返回任何行。
  • 这里您的第二个查询返回一行,但是您加入 2 个表的第一个查询没有返回任何行,因为 A 的开始时间 1900-01-01 21:00:00 不会发生在 1900-01-01 21:47:43.0 和 1900-01-01 21:47:48.0 和 A 之间endTime 1900-01-01 不会出现在 1900-01-01 21:47:43.0 和 1900-01-01 21:47:48.0 之间。那么如何更正第一个查询。
  • A 是包含范围的表格,对吧?第一个查询说 b 的 start_time 必须在 A 的范围之间,而 b 的 end_time 必须在 A 的范围之间,完全封装。如果范围在应该工作的 A 中。
  • 是 A 是带有范围的表。由于我们试图在存在范围的表 A 中查找记录,因此我尝试使用 B 的开始和结束时间,并且我编辑了具有新查询的问题。你能检查它是否一致。我认为您的第二个查询和我新编辑的查询是一样的。
猜你喜欢
  • 2012-09-04
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
相关资源
最近更新 更多