根据数据库数据获取一组日期/时间范围

时间:2009-10-11 20:45:54

标签: sql

我有一个充满活动记录的SQL 2005 DB,其中包括DateTime列,DeviceID和各种数据位。我需要一个查询,它会根据DeviceID(可能受开始/结束时间限制)给出一个日期/时间范围列表。此外,我会考虑一个新的范围,在旧的范围结束后至少60分钟开始(如果它不到60分钟,则它是旧范围的一部分)。

示例数据:

DateTime                 DeviceID
2009-10-11 12:01:30      Dev1
2009-10-11 12:02:30      Dev1
2009-10-11 12:03:21      Dev1
2009-10-11 12:04:30      Dev1
2009-10-11 12:05:45      Dev1
2009-10-11 12:06:10      Dev1
2009-10-11 12:07:40      Dev1
2009-10-11 12:08:20      Dev1
2009-10-11 13:30:11      Dev1
2009-10-11 13:32:21      Dev1
2009-10-11 13:36:45      Dev1
2009-10-11 13:39:16      Dev1
2009-10-11 13:42:18      Dev1
2009-10-11 13:46:22      Dev1
2009-10-11 13:48:35      Dev1

预期结果:

StartDate                EndDate
2009-10-11 12:01:30      2009-10-11 12:08:20
2009-10-11 13:30:11      2009-10-11 13:48:35

1 个答案:

答案 0 :(得分:0)

阅读有关ROW_NUMBER()

的内容

然后看看这个查询:

SELECT <br>
&nbsp;&nbsp;  DeviceID,<br>
&nbsp;&nbsp;  "DateTime",<br>
&nbsp;&nbsp;  ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br>
FROM TableName

Then look at this query:

WITH DateTable <br>
AS<br>
(SELECT <br>
&nbsp;&nbsp;  DeviceID,<br>
 &nbsp;&nbsp; "DateTime",<br>
&nbsp;&nbsp;  ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br>
FROM TableName)<br>
SELECT <br>
&nbsp;&nbsp;  D1.DeviceID,<br>
&nbsp;&nbsp;  D1."DateTime" EndDate,<br>
&nbsp;&nbsp;  D2."DateTime" StartDate<br>
FROM DateTable D1<br>
JOIN DateTable D2<br>
ON (D1.DeviceID = D2.DeviceID) <br>
&nbsp;&nbsp;  AND (D1.OrdinalNumber = D2.OrdinalNumber - 1) <br>
&nbsp;&nbsp;  AND (DATEDIFF(MINUTE,D1."DateTime",D2."DateTime") >= 60)<br>

我们正在寻找差距超过60分钟的差距。

现在,您必须从每一行获取StartDate并将其与下一个EndDate匹配。既然是早上4点,我会把它留给你:)