7

我有一个表格,其中包含每个连续小时的记录。每个小时都有一些价值。我想要一个 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
4

2 回答 2

18

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

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)
于 2010-04-22T18:00:00.830 回答
0

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

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

于 2010-04-22T17:58:44.547 回答