0

我有一个查询告诉我客户端在过去一小时内何时没有与我们的服务器通信。发生这种情况时,我需要发送电子邮件。

这是检索所有未及时通信的客户端的查询。

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

但是,如果客户几天没有联系,我只想发送一封电子邮件。我还想在以前损坏的客户重新上线时发送电子邮件。为此,我在名为“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 回答
1

这看起来比你的表达更简单;

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

一个用于测试的 SQLfiddle

于 2013-05-06T17:12:05.103 回答
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 回答