我有一个查询告诉我客户端在过去一小时内没有与我们的服务器通信。当发生这种情况时,我需要发送电子邮件。
这是检索所有未及时通信的客户端的查询。
SELECT * FROM Client
WHERE DATEADD(HOUR, 1, LastCommunication) < GetDate()
但是,如果客户几天没有通信,我只想发送一封电子邮件。我还想在以前破损的客户端重新上线时发送电子邮件。为此,我在名为“IsErrorNotified”的表中添加了一个位列。
我想只获取错误状态已更改的客户端。通常,我会这样做:
SELECT * FROM Client
WHERE DATEADD(HOUR, 1, LastCommunication) < GetDate() = IsErrorNotified
然而,这不起作用。我该怎么做?
答案 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;
答案 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 ...