2010-04-22 148 views
6

我有一张表,每个连续的小时记录一次。每个小时都有一定的价值。我想要一个T-SQL查询来检索缺失的记录(缺少小时,缺口)。因此,对于下面的DDL,我应该得到一个失踪时间04/01/2010 02:00 AM的记录(假定日期范围介于第一个和最后一个记录之间)。使用SQL Server 2005.倾向于基于集合的查询。使用SQL查找数据库记录中的间隙(缺失记录)

DDL: 
CREATE TABLE [Readings](
    [StartDate] [datetime] NOT NULL, 
    [SomeValue] [int] NOT NULL 
) 
INSERT INTO [Readings]([StartDate], [SomeValue]) 
SELECT '20100401 00:00:00.000', 2 UNION ALL 
SELECT '20100401 01:00:00.000', 3 UNION ALL 
SELECT '20100401 03:00:00.000', 45 

回答

15

假设所有记录都准确时间:

WITH q(s, e) AS 
     (
     SELECT MIN(StartDate), MAX(StartDate) 
     FROM Readings 
     UNION ALL 
     SELECT DATEADD(hour, 1, s), e 
     FROM q 
     WHERE s < e 
     ) 
SELECT * 
FROM q 
WHERE s NOT IN 
     (
     SELECT StartDate 
     FROM Readings 
     ) 
OPTION (MAXRECURSION 0) 
+2

OMG ....这是惊人的,以你如何快速写了这个。就是棒。 – Raja 2010-04-22 18:03:11

+0

我不能上下投票这是因为我看着这个sql去.. gaaaaahhahahaaaa – 2010-04-22 18:06:55

+0

这是一个甜蜜的查询。我从来没有意识到可以递归地使用WITH。 – RedFilter 2010-04-22 18:23:20

0

我可以看到解决这个问题的唯一方法是创建一个表,你希望拥有的所有日期,然后执行连接到要检查间隙表。您可以创建一个函数,该函数需要2个日期才能返回包含这两个日期之间的所有小时数的表格,因此,您无需为每次要查找给定时间段内的所有空位都创建一个新表格。

这是一个基于集合的解决方案,一旦你有一个表中的所有日期。我不认为有一种方法可以在没有日期的情况下生成表格,而且我非常肯定你不能以基于集合的方式来做到这一点。