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 lastdate,但实际上这通常更容易写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略有偏好,因为它让读者立即清楚你正在检查一个范围的一个字段 。 如果您的表中有相似的字段名称,则更是如此。

如果说,如果我读了,我们的表同时具有transactiondatetransitiondate

 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 ,当然,这将是一个语法错误,并及时修复。