使用SQL查找数据库记录中的间隙(缺少记录)

时间:2010-04-22 17:50:37

标签: sql sql-server tsql sql-server-2005 gaps-and-islands

我有一个连续每小时都有记录的表格。每小时都有一些价值。我想要一个T-SQL查询来检索丢失的记录(缺少时间,间隙)。因此,对于下面的DDL,我应该获取缺失小时的记录04/01/2010 02:00 AM(假设日期范围在第一个和最后一个记录之间)。使用SQL Server 2005.首选基于集合的查询。

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

2 个答案:

答案 0 :(得分:17)

假设所有记录都是确切的小时数:

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)

答案 1 :(得分:0)

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

一旦您拥有包含所有日期的表格,这是一个基于集合的解决方案。如果没有先生成一个包含日期的表格,我认为没有办法做到这一点,我很确定你不能以基于集合的方式做到这一点。