如何确定表中不存在时间戳的时间

时间:2009-07-15 14:23:05

标签: sql

我有一个每小时接收一次数据的表。此导入过程的一部分将导入的时间戳写入表。我的问题是,如何构建一个查询来生成导入未写入表的时间段的结果集?

我的第一个想法是拥有一个静态int表,只做一个外连接并在右侧寻找空值,但这似乎有点草率。是否有更动态的方法来根据时间戳为导入失败的时间生成结果集?

这是一个MS SQL 2000框。

更新:我想我已经知道了。已经提供的两个答案很棒,但我正在处理的是一个函数,它返回一个我正在寻找给定时间范围的值的表。完成后我会在这里发布解决方案。

2 个答案:

答案 0 :(得分:1)

以下是我博客中本文稍微修改过的解决方案:

DECLARE @t TABLE
        (
        q_start DATETIME NOT NULL,
        q_end DATETIME NOT NULL
        )
DECLARE @qs DATETIME
DECLARE @qe DATETIME
DECLARE @ms DATETIME
DECLARE @me DATETIME
DECLARE cr_span CURSOR FAST_FORWARD
FOR
SELECT  s_timestamp AS q_start,
        DATEADD(minute, 1, s_timestamp) AS q_end
FROM    [20090611_timespans].t_span
ORDER BY
        q_start
OPEN    cr_span
FETCH   NEXT
FROM    cr_span
INTO    @qs, @qe
SET @ms = @qs
SET @me = @qe
WHILE @@FETCH_STATUS = 0
BEGIN
        FETCH   NEXT
        FROM    cr_span
        INTO    @qs, @qe
        IF @qs > @me
        BEGIN
                INSERT
                INTO    @t
                VALUES (@ms, @me)
                SET @ms = @qs
        END
        SET @me = CASE WHEN @qe > @me THEN @qe ELSE @me END
END
IF @ms IS NOT NULL
BEGIN
        INSERT
        INTO    @t
        VALUES  (@ms, @me)
END
CLOSE   cr_span

这将在更新确实发生时以分钟分辨率返回连续范围。

如果您的timestamp字段中包含索引,则可以发出以下查询:

SELECT  *
FROM    records ro
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    records ri
        WHERE   ri.timestamp >= DATEADD(minute, -1, ro.timestamp)
                AND ri.timestamp < ro.timestamp
        )

答案 1 :(得分:0)

我在想这样的事情:

select 'Start' MissingStatus, o1.LastUpdate MissingStart
from Orders o1
left join Orders o2
on o1.LastUpdate between 
  dateadd(ss,1,o2.LastUpdate) and dateadd(hh,1,o2.LastUpdate)
where o2.LastUpdate is null
union all
select 'End', o1.LastUpdate MissingEnd
from Orders o1
left join Orders o2
on o1.LastUpdate between 
 dateadd(hh,-1,o2.LastUpdate) and dateadd(ss,-1,o2.LastUpdate)
where o2.LastUpdate is null
order by 2