2009-07-15 38 views
1

我有一個小時接收數據的表。此導入過程的一部分將導入的時間戳記寫入表格。我的問題是,如何構建一個查詢來生成導入未寫入表的時間段的結果集?如何確定何時在表中不存在時間戳

我的第一個想法是有一個靜態int表,只是做一個外部聯接,並在右側尋找空值,但這似乎有點草率。是否有一種更動態的方式來根據時間戳生成導入失敗次數的結果集?

這是一個MS SQL 2000框。

更新:我想我已經明白了。已經提供的兩個答案很好,但我正在處理的是一個函數,該函數返回我在給定時間範圍內查找的值的表格。一旦我完成了,我會在這裏發佈解決方案。

回答

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 
     ) 
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