2

定期的に処理する必要のあるイベントのリストがあります。プロセスはしばらくの間イベントを処理しますが、その後、再度処理する必要があります。つまり、イベントごとに、イベントが「処理」された日付範囲のリストが表示され、ギャップがある場合は、その時点でイベントが未処理の状態であったことを意味します。このために、2つのテーブルを使用します。

テーブルプロセス

ProcessID int PK NOT NULL  
EffectiveDays int NOT NULL

テーブル処理

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

EventIDは、SQLクエリの結果に基づいて標準的な方法で動的に生成され、実行全体で一定であることを保証します。

このシグニチャを使用してメソッドを実装できるようにしたいと思います(ループで呼び出す必要がある場合があります)。

bool Event.WasProcessed(DateTime AsOf)

特定の日付について、イベントが発生した状態(処理済みかどうか)を照会できる必要があります。したがって、提供された日付が(重複する可能性のある)日付範囲のいずれかにあるかどうかを確認する必要があります。

このクエリをSQLで実行するのかコードで実行するのかさえわかりません。クエリは、任意の一連のイベント(各イベントを保持するオブジェクトと処理のリストで表す)で実行する必要がある場合があるため、SQLで実行すると、DBにかなりの影響を与える可能性があります。一方、SQLは一般的にクエリで高速です。一方、この同様の問題は、カーソルベースのソリューションがとにかく必要であることを示しています。

たとえそれらがより良い検索文字列であるとしても、どんなポインタでもありがたいです。(日付範囲の問題をグーグルで検索するには、ある程度のスキルが必要なようです。)

4

1 に答える 1

0

任意の日付のイベントの状態を照会するには:

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

アップデート:

日付がからprocessedの範囲内である場合、イベントは特定の日付にあると想定します。EffectiveDaysDateProcessed

SELECT  p.ProcessID
FROM    Processings pi
LEFT JOIN
        Processes p
ON      p.ProcessID = pi.ProcessID
        AND p.EffectiveDays >= @date - pi.DateProcessed
WHERE   pi.EventID = @EventID
        AND pi.DateProcessed <= @date
于 2009-08-19T13:41:49.140 に答える