2009-07-15 3 views
1

Ich habe eine Tabelle, die Daten auf einer stündlichen Basis empfängt. Ein Teil dieses Importprozesses schreibt den Zeitstempel des Imports in die Tabelle. Meine Frage ist, wie kann ich eine Abfrage erstellen, um eine Ergebnismenge der Zeiträume zu erzeugen, wenn der Import nicht in die Tabelle geschrieben hat?Wie zu bestimmen, wenn ein Zeitstempel in einer Tabelle nicht vorhanden ist

Mein erster Gedanke ist eine Tabelle von static int haben und nur noch eine äußere Verknüpfung und für NULL-Werte auf der rechten Seite zu sehen, aber dies scheint Art von schlampig. Gibt es eine dynamischere Möglichkeit, eine Ergebnismenge für die Zeiten zu erstellen, zu denen der Import aufgrund des Zeitstempels fehlgeschlagen ist?

Dies ist eine MS SQL 2000-Box.

Update: Ich denke, ich habe es. Die zwei Antworten, die ich bereits erhalten habe, sind großartig, aber stattdessen arbeite ich an einer Funktion, die eine Tabelle der Werte zurückgibt, die ich für einen bestimmten Zeitraum suche. Sobald ich fertig bin, werde ich die Lösung hier posten.

Antwort

1

Hier ist eine leicht modifizierte Lösung aus diesem Artikel in meinem Blog:

 

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 

Dies wird Ihnen die aufeinanderfolgenden Bereiche zurück, wenn Updates der Fall war (mit eine winzige Auflösung).

Wenn Sie einen Index auf Ihrem timestamp Feld haben, können Sie die folgende Abfrage:

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

Ich dachte so etwas wie dieses:

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 
Verwandte Themen