T-SQL查询其中DateTime范围WHERE条件是由另一个查询生成的

时间:2011-07-06 13:19:46

标签: sql tsql

如何编写T-SQL查询,其中日期时间范围的过滤条件是从另一个查询生成的。

例如,查询A将返回:

StartTime                   EndTime
2011-07-06 04:05:42.137     2011-07-06 04:05:58.503
2011-07-06 04:25:51.103     2011-07-06 04:26:07.017
2011-07-06 04:55:56.240     2011-07-06 04:56:04.480
...

如何返回starttime和endtime对中的所有结果?

4 个答案:

答案 0 :(得分:2)

此WHERE子句将返回与特定时间窗口重叠的所有记录。

WHERE
      StartTime < myEndTimeLimit
  AND EndTime   > myStartTimeLimit

注意:根据您的endTimes是否包含(包括那个时刻)和删除(在那一刻之前的所有内容),您可能需要&lt; =和&gt; =而不是&lt;和&gt;。


同样,这可以是加入的一部分......

  TableA
INNER JOIN
  TableB
    ON  <some matching condition>
    AND TableA.StartTime < TableB.EndTime
    AND TableA.EndTime   > TableB.StartTime

(表B可以是子查询)


注意:此类查询在使用索引进行优化方面非常差。

如果你有一年的数据,并且你找到与“今天”的重叠,第一个条件(A.Start&lt; B.End),几乎所有的记录都被返回,然后扫描匹配(A.End&gt; B.Start)。

最简单的优化是“知道”任何时间窗口的最大长度。如果所有条目总是少于30天,您可以执行以下操作(修改您的RDBMS表示法)。

  TableA
INNER JOIN
  TableB
    ON  <some matching condition>
    AND TableA.StartTime <  TableB.EndTime
    AND TableA.StartTime >= TableB.StartTime - 30
    AND TableA.EndTime   >  TableB.StartTime

现在可以提供30天的范围,其中TableA.StartTime可以存在,随着时间的推移会提供更好的性能。

答案 1 :(得分:0)

将您的其他表格加入此查询。

然后提供额外的AND子句以匹配日期。

提供正在使用的表格结构或查询以获得更多帮助。

答案 2 :(得分:0)

将这些对返回临时表,然后将临时表与主表连接。

答案 3 :(得分:0)

要使用一个查询的结果来过滤另一个查询,它看起来像这样:

SELECT StartTime, EndTime
FROM LogEntries
WHERE StartTime > (SELECT Min(TimeColumn) FROM Times)
AND EndTime < (SELECT Max(TimeColumn) FROM Times)

如果您想要更复杂,可以在两个表上创建一个连接,以便从“Times”表或查询语句中提取值。