我有一个每小时接收一次数据的表。此导入过程的一部分将导入的时间戳写入表。我的问题是,如何构建一个查询来生成导入未写入表的时间段的结果集?
我的第一个想法是拥有一个静态int表,只做一个外连接并在右侧寻找空值,但这似乎有点草率。是否有更动态的方法来根据时间戳为导入失败的时间生成结果集?
这是一个MS SQL 2000框。
更新:我想我已经知道了。已经提供的两个答案很棒,但我正在处理的是一个函数,它返回一个我正在寻找给定时间范围的值的表。完成后我会在这里发布解决方案。
答案 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