0

過去 1 時間にクライアントがサーバーと通信していないことを知らせるクエリがあります。そうなったら、メールを送らないといけません。

これは、時間内に通信していないすべてのクライアントを取得するクエリです。

SELECT * FROM Client 
    WHERE DATEADD(HOUR, 1, LastCommunication) < GetDate()

ただし、クライアントから何日も連絡がない場合は、メールを 1 通だけ送信したいと考えています。また、以前に壊れていたクライアントがオンラインに戻ったときにメールを送信したいと考えています。この目的のために、「IsErrorNotified」という名前のテーブルにビット列を追加しました。

エラー状態が変化したクライアントのみを取得したい。通常、私はこれを行います:

SELECT * FROM Client 
    WHERE DATEADD(HOUR, 1, LastCommunication) < GetDate() = IsErrorNotified

ただし、これは機能しません。どうすればいいですか?

4

3 に答える 3

2

これを探していますか?

SELECT * FROM Client 
    WHERE DATEADD(HOUR, 1, LastCommunication) < GetDate()
        AND IsErrorNotified = 1

sargableしかし、述語を使用するのは良いことです

SELECT * FROM Client 
    WHERE LastCommunication < DATEADD(HOUR, -1, GetDate())
        AND IsErrorNotified = 1
于 2013-05-06T17:09:16.813 に答える
0

次のように完全な条件を記述するには、ブール論理の同等性を使用する必要がありました。

SELECT * FROM Client 
    WHERE (LastCommunication >= DATEADD(HOUR, -1, GetDate()) AND IsErrorNotified = 1) 
    OR (LastCommunication < DATEADD(HOUR, -1, GetDate()) AND IsErrorNotified = 0)

SQL Server でブール値の XOR (ブール値の比較と同じ) を実行するより良い方法を見つけたいと思います...

于 2013-05-06T17:31:30.257 に答える