SQL Server:比较布尔表达式结果

时间:2013-05-06 17:06:07

标签: boolean sql-server-2012

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

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

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

但是,如果客户几天没有通信,我只想发送一封电子邮件。我还想在以前破损的客户端重新上线时发送电子邮件。为此,我在名为“IsErrorNotified”的表中添加了一个位列。

我想只获取错误状态已更改的客户端。通常,我会这样做:

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

然而,这不起作用。我该怎么做?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

An SQLfiddle to test with

答案 2 :(得分: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 ...