SQL:BETWEEN vs <=和> =
在SQL服务器(2000年和2005年)这两个查询有什么区别? 我应该select哪一种scheme?
查询1:
Select EventId,EventName from EventMaster where EventDate BETWEEN '10/15/2009' and '10/18/2009'
QUERY2:
Select EventId,EventName from EventMaster where EventDate >='10/15/2009' and EventDate <='10/18/2009' --Edit: second Eventdate was originally missing, hence query syntactically wrong
它们是相同的: BETWEEN
是问题中较长语法的简写。
在BETWEEN
不起作用的地方使用另一种更长的语法
Select EventId,EventName from EventMaster where EventDate >= '10/15/2009' and EventDate < '10/18/2009'
(注意<
而不是<=
在第二种情况下)。
他们是一样的。
需要注意的一点是,如果你使用的是DATETIME,那么结束date的匹配就是一天的开始:
<= 20/10/2009
不一样:
<= 20/10/2009 23:59:59
(它会匹配<= 20/10/2009 00:00:00.000
)
虽然BETWEEN
易于阅读和维护,但我很less推荐使用它,因为它是一个封闭的时间间隔,如前所述,这可能是date问题 – 即使没有时间分量。
例如,在处理每月数据时,通常比较BETWEEN first AND last
date,但实际上这通常更容易写dt >= first AND dt < next-first
(这也解决了时间部分问题) – 因为确定last
通常比确定next-first
(通过减去一天)要长一个步骤。
另外,另一个问题是,需要按照正确的顺序 (即, BETWEEN low AND high
)来指定下限和上限。
通常情况下,没有任何区别 – BETWEEN
关键字在所有RDBMS平台上都不受支持,但如果是这样,两个查询应该是相同的。
由于它们是相同的,所以在速度或其他方面没有任何区别 – 使用看起来更自然的那个。
我认为唯一的区别是每个查询语法糖的数量。 BETWEEN只是一种和第二个查询完全相同的方式。
可能有一些RDBMS特定的差异,我不知道,但我真的不这么认为。
正如@marc_s,@Cloud等人所提到的那样。 它们在封闭范围内基本相同。
但是任何小数时间值都可能会导致问题发生在一个封闭的范围(大于或等于, 小于或等于 ),而不是半开放范围(大于或等于小于 ),并且在最后一刻。
所以为了避免查询应该被重写为:
SELECT EventId, EventName FROM EventMaster WHERE (EventDate >= '2009-10-15' AND EventDate < '2009-10-19') /* <<<== 19th, not 18th */
由于BETWEEN
不能用于半打开的时间间隔,所以我总是仔细看看使用它的任何date/时间查询,因为它可能是一个错误。
从逻辑上讲,没有任何区别。 性能明智的是,在大多数数据库pipe理系统中,没有任何区别。
从Aaron Bertrand看到这篇出色的博客文章 ,告诉你为什么你应该改变你的string格式,以及如何在date范围查询中处理边界值。
我对BETWEEN
略有偏好,因为它让读者立即清楚你正在检查一个范围的一个字段 。 如果您的表中有相似的字段名称,则更是如此。
如果说,如果我读了,我们的表同时具有transactiondate
和transitiondate
transactiondate between ...
我马上知道,testing的两端都是对这个领域。
如果我读了
transactiondate>='2009-04-17' and transactiondate<='2009-04-22'
我必须花一点时间来确保两个字段是相同的。
而且,随着查询逐渐被编辑,一个sl program的程序员可能会分开这两个字段。 我已经看到很多的问题了
where transactiondate>='2009-04-17' and salestype='A' and customernumber=customer.idnumber and transactiondate<='2009-04-22'
如果他们试着用BETWEEN
,当然,这将是一个语法错误,并及时修复。