2009-08-19 5 views
2

Ich habe eine Liste von Ereignissen, die auf einer konstanten Basis verarbeitet werden müssen. Der Prozess kümmert sich für einige Zeit um das Ereignis, woraufhin es erneut verarbeitet werden muss. Das bedeutet, dass ich für jedes Ereignis eine Liste mit Datumsbereichen erhalte, in denen das Ereignis "erledigt" wurde und Lücken bedeuten, dass sich das Ereignis zu diesem Zeitpunkt in einem unverarbeiteten Zustand befand. Dazu verwende ich zwei Tabellen:Suchen, ob ein bestimmtes Datum in einer Liste von Datumsbereichen ist

Tabelle Prozesse

ProcessID int PK NOT NULL 
EffectiveDays int NOT NULL 

Tabelle Processings

EventID nvarchar(128) NOT NULL 
ProcessID int FK REFERENCES Processes NOT NULL 
DateProcessed int NOT NULL 

EreignisID dynamisch in üblichen Weise auf den Ergebnissen einer SQL-Abfrage basierend erzeugt wird, um sicherzustellen, dass es Konstante über Läufe.

ich in der Lage möchte eine Methode mit dieser Signatur zu implementieren (müssen es manchmal in einer Schleife aufgerufen werden):

bool Event.WasProcessed(DateTime AsOf) 

Ich brauche zu einem bestimmten Zeitpunkt in der Lage sein zu fragen, denn die Geben Sie an, ob das Ereignis stattgefunden hat (verarbeitet oder nicht). Also müsste ich herausfinden, ob das angegebene Datum in irgendein eines der Datumsbereiche (die sich überschneiden können) oder nicht.

Ich bin nicht einmal sicher, ob diese Abfrage in SQL oder Code ausgeführt werden soll. Die Abfrage muss manchmal auf einer beliebigen Reihe von Ereignissen ausgeführt werden (von denen jedes von einem Objekt repräsentiert wird, das das Ereignis und eine Liste von Verarbeitungen enthält), also könnte das Ausführen der Operation in SQL bedeuten, dass die DB ziemlich oft getroffen wird. Auf der anderen Seite ist SQL bei Abfragen im Allgemeinen schneller. Auf der anderen Seite zeigt this similar issue, dass eine cursorbasierte Lösung sowieso benötigt würde.

Alle Zeiger würden geschätzt, auch wenn sie nur bessere Suchzeichenfolgen sind. (Jede daterange Ausgabe Googeln scheint etwas Geschick mit, dass erfordert.)

+0

Welche Programmiersprache? Du hast es nicht gesagt. – scragar

+0

Ich benutze C#, aber ich denke, ich kann eine Antwort aus anderen Sprachen übersetzen. –

+0

Könnten Sie bitte ein kleines Beispiel Ihrer Datenbank geben und was würden Sie gerne abfragen? – Quassnoi

Antwort

0

Um den Zustand des Ereignisses für einen bestimmten Zeitpunkt abfragen:

SELECT TOP 1 eventState 
FROM processing 
WHERE eventId = @id 
     AND processingDate <= GETDATE() 
ORDER BY 
     processingDate DESC 

Update:

Ich nehme an ein Ereignis ist processed zu einem bestimmten Datum, wenn das Datum innerhalb EffectiveDays von DateProcessed ist.

+0

Ich nehme an, dass eventState berechnet wird, da es nicht in Processings ist (und nicht so sein kann, wie es vom Datum abhängt). Können Sie klären, wie es in einer vollständigen Abfrage berechnet wird? (Ich habe eine Vorstellung davon, was Sie meinen, aber es kann nicht in einen Kommentar passen.) –

+0

Nur zwei Änderungen notwendig. pi.DateProcessed sollte auch nicht nach dem Abfragedatum liegen, da dies einige Zeit in der Vergangenheit sein kann, seit dem andere Verarbeitungen durchgeführt worden sein könnten. Auch von ln 6 an sind p & pi verwirrt. Vielen Dank. Ich werde das Problem erneut untersuchen, wenn die Schleife zu viele DB-Treffer verursacht. –

Verwandte Themen