如何编写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对中的所有结果?
答案 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”表或查询语句中提取值。