2013-05-06 54 views
0

我有一個查詢,告訴我客戶端在最近一小時內沒有與我們的服務器通信。發生這種情況時,我需要發送電子郵件。SQL Server:比較布爾表達式結果

這是用於檢索所有未及時通信的客戶端的查詢。

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

但是,如果客戶沒有在幾天內通信,我只想發送一個單一的電子郵件。我還想在先前斷開的客戶端恢復聯機時發送電子郵件。爲此,我在名爲「IsErrorNotified」的表中添加了一個位列。

我想只獲取錯誤狀態已更改的客戶端。通常,我會這樣做:

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

但是,這是行不通的。我應該怎麼做?

回答

1

這個看上去比你的表達更簡單;

SELECT * FROM Client 
WHERE CASE WHEN DATEADD(HOUR, -1, GetDate()) > LastCommunication 
      THEN IsErrorNotified ELSE ~IsErrorNotified END = 0; 

An SQLfiddle to test with

+0

它完美地工作,它更可讀。 – 2013-05-06 19:04:49

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 
+0

不,我真的需要做一個位值與「<」運算符的結果之間的平等檢查。我只是認爲我可以使用XOR操作符......我現在正在嘗試一些操作。 – 2013-05-06 17:11:31

+0

感謝您的可靠提示,我沒有考慮到 – 2013-05-06 17:13:29

+0

+1可悲的部分,我可惜完全錯過了:) – 2013-05-06 17:16:37

0

我曾與一些布爾邏輯等效性合作,像這樣寫的完成條件:

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

我還是想找到這樣一個布爾XOR一個更好的方式(這是同一個比較布爾與SQL Server ...