2014-01-15 50 views
0

我试图将表中的结果限制在与日期不重叠的记录中。正如你在下面的截图中看到的,我试图添加一个子句来过滤掉等于“结束”列的记录。查看该查询的最后一行。为什么这个“where”子句不会限制sql结果

我不明白为什么结果仍然显示屏幕截图中的记录。有人可以帮我解释吗?这可能是一个语法的东西?

谢谢!

SQL Where clause not filtering

+4

提示:在唯一无用的地方使用括号。 –

+2

代码作为图像不是很有用 – niyou

回答

5

您主要有:

a OR b AND c AND d AND e AND f 

...你可能想:

(a OR b) AND c AND d AND e AND f 

参考:Operator Precedence

+0

谢谢,就是这样。使总体感觉! – Jorre

2

AND具有更高的operator precedenceOR有。

这意味着,你AND条款将被首先解释,以便在年底有类似

where (...) or (... and ... and ...) 

由于OR('2014-01-14 18:30:00' between start and end))之前,满足第一个条件,你的行显示了。将OR条款的双方置于禁忌之列,并且应该按照您的要求工作。

1

问题是您的WHERE子句的第一部分正在传递该记录。我相信你需要更多的括号。

我并不完全确定您试图使用您提供的数据实现的目标,但在关键字OR和最后的右括号之后应该有一个左括号。

像这样:

where 
('2014-01-14 18:30:00' between start and end) 
or (('2014-01-14 19:30:00' between start and end) 
and ('2014-01-14 18:30:00' != start) 
and ('2014-01-14 19:30:00' != end) 
and ('2014-01-14 19:30:00' != start) 
and ('2014-01-14 18:30:00' != end)) 
1

由于2014-01-14 18:30是其为TRUE条件2014-01-14 16:002014-01-14 18:30之间。并且[(TRUE)或(其他)]也是TRUE

相关问题