Как определить, когда отметка времени не существует в таблице - PullRequest
1 голос
/ 15 июля 2009

У меня есть таблица, которая получает данные ежечасно. Часть этого процесса импорта записывает временную метку импорта в таблицу. У меня вопрос, как я могу построить запрос для получения результирующего набора периодов времени, когда импорт не записывал в таблицу?

Моя первая мысль - иметь таблицу static int и просто выполнить внешнее соединение и искать нулевые значения справа, но это кажется неаккуратным. Есть ли более динамичный способ получения набора результатов для случаев, когда импорт не удался, на основе отметки времени?

Это окно MS SQL 2000.

Обновление: Я думаю, что понял. Два предоставленных ответа - это здорово, но вместо этого я работаю над функцией, которая возвращает таблицу значений, которые я ищу для данного периода времени. Как только я закончу, я опубликую решение здесь.

Ответы [ 2 ]

1 голос
/ 15 июля 2009

Вот немного измененное решение из этой статьи в моем блоге:

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 голосов
/ 15 июля 2009

Я думал что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...