在前面的答案中添加一点:
检查您的过滤器是否按照您的预期进行。使用OR
可以很容易地向您展示意想不到的结果。SQL 基本上是按顺序读取WHERE
查询的一部分(尽管优化器可以更改它需要的顺序),因此您上面的查询说要为您提供以下行:
1) `sDate > '2015-01-01'`
OR
2) `userID = 22 AND isActive = 1`
OR
3) `userID = 8 AND isActive = 0`
OR
4) `userID = 7 AND isActive = 1`
因此,如果sDate <= '2015-01-01'
那样,它将继续检查userID
and isActive
。对我来说,它有助于明确地阻止OR
条件,以便我可以更轻松地看到我正在尝试做的事情`
WHERE sDate > '2015-01-01`
AND (
( userID = 22 AND isActive = 1 )
OR
( userID = 8 AND isActive = 0 )
OR
( userID = 7 AND isActive = 1 )
)
这将使sDate
您的查询成为必需的条件。
我还要指出,在约会方面,您必须注意自己的界限。您上面的查询将排除January 1, 2015 at 12:00 AM
(如果sDate
包括时间部分,或者如果不包括一整天)。所以你可能一直在寻找>=
. 另外,请注意日期类型的精度。例如,在 SQL Server 中,adatetime
仅精确到千分之一秒,因此如果事件发生在 上Dec 31, 2015 at 23:59:59.998
,SQL 会认为它就像发生在 上一样Jan 1, 2015 at 00:00:00.000
。尤其是日期,请注意边缘情况。
如果你想稍微缩短你的条件,你也可以使用:
WHERE sDate > '2015-01-01'
AND (
( isActive = 0 AND userID = 8 )
OR
( isActive = 1 AND userID IN (22,7) )
)
说userID IN (22,7)
是的简写userID=22 OR userID=7
。