在SQL Server 2000和2005:
- 正是这两者之间的区别
WHERE
子句? - 哪一个我应该在哪些情况下使用?
问题1:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'
问题2:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
AND EventDate <='10/18/2009'
(编辑:第二EVENTDATE原本已丢失,因此查询是语法错误)
Answer 1:
它们是相同的: BETWEEN
是在问题的时间越长语法速记。
使用替代较长的语法,其中BETWEEN
不起作用如
Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'
(注<
而不是<=
在第二条件)。
Answer 2:
他们是一样的。
有一两件事要小心的是,如果你正在使用这对一个DATETIME,比赛的结束日期将是一天的开始:
<= 20/10/2009
是不一样的:
<= 20/10/2009 23:59:59
( 它将匹配针对<= 20/10/2009 00:00:00.000
)
Answer 3:
虽然BETWEEN
易于阅读和维护,我很少推荐它的使用,因为它是一个封闭的区间,并如前面提到的这可能是与日期的问题-即使没有时间分量。
例如,月度数据处理时,它往往是常见的比较日期BETWEEN first AND last
,但在实践中,这通常是比较容易写dt >= first AND dt < next-first
(这也解决了一部分时间问题) -因为确定last
通常比确定更长的一个步骤next-first
(通过减去天)。
此外,另一个小问题,就是上限和下限也必须按照正确的顺序被指定(即BETWEEN low AND high
)。
Answer 4:
通常情况下,没有任何区别- BETWEEN
关键字不支持所有的关系型数据库平台,但如果是,这两个查询应该是相同的。
因为他们是一样的,没什么速度或别的方面没有任何区别 - 使用似乎更自然的你的人。
Answer 5:
正如@marc_s,@Cloud等人提及。 他们基本上是一个封闭的范围是相同的。
但是,任何分数时间值可能会导致具有封闭范围的问题(大于或-等于且小于或-等于 )与之后的最终值相对于一个半开区间(大于或-等于和小于 )最后可能时刻。
因此,为了避免该查询应该被改写为:
SELECT EventId, EventName
FROM EventMaster
WHERE (EventDate >= '2009-10-15' AND
EventDate < '2009-10-19') /* <<<== 19th, not 18th */
由于BETWEEN
不会为半开区间工作,我总是在使用它,因为它可能是一个错误的任何日期/时间查询很难看。
Answer 6:
我认为,唯一的区别是对每个查询语法糖的量。 之间是说完全一样,第二次查询的只是一个华而不实的方式。
有可能是我不知道的一些RDBMS具体差异,但我真的不这么认为。
Answer 7:
从逻辑上有根本没有区别。 性能方面有 - 通常,在大多数DBMSes-没有区别的。
Answer 8:
看到这个优秀的博客文章从阿龙贝特朗为什么你应该改变你的字符串格式和边界值如何日期范围查询处理。
Answer 9:
我有轻微的偏好BETWEEN
,因为它使得它立即清楚地知道你正在检查一个字段的范围读卡器。 如果你在你的表中有相似的字段名称时尤其如此。
如果说,我们的餐桌既有transactiondate
和transitiondate
,如果我读
transactiondate between ...
我立即知道了测试的两端都反对这一领域。
如果我读
transactiondate>='2009-04-17' and transactiondate<='2009-04-22'
我不得不采取额外的时间来确保这两个领域是相同的。
此外,作为一个查询被编辑随着时间的推移,一个草率的程序员可能分开的两个领域。 我见过很多是这样说的查询
where transactiondate>='2009-04-17'
and salestype='A'
and customernumber=customer.idnumber
and transactiondate<='2009-04-22'
如果他们试试这个用BETWEEN
,当然,这将是一个语法错误,并及时修复。
Answer 10:
免责声明:以下是一切只有零星的,并直接从我个人的经验得出。 任何人,感觉达进行了更严格的实证分析,欢迎携带出来,下来投票,如果我。 我也知道,SQL是一种声明语言,你不应该要考虑如何当你写你的代码被处理,但是,因为我珍惜我的时间,我做的。
有无限的逻辑等效的语句,但我会考虑三个(ISH)。
情况1:在一个标准顺序两种比较(评价顺序固定)
A> = MinBound AND A <= MaxBound
情况2:句法糖(评价顺序不是由作者选择的)
之间MinBound和MaxBound
情况3:在一个受过教育的顺序两种比较(评价顺序在写入时间选择)
A> = MinBound AND A> = MaxBound
要么
A> = MaxBound AND A> = MinBound
根据我的经验,案例1和第2种情况没有任何性能上的一致或显着的不同,因为它们是集无知。
然而,案例3,可大大提高执行时间。 特别是,如果你有一个大的数据集工作,碰巧有关于是否更可能比MinBound您可以通过使用案例3和订购比较显着提高执行时间大于MaxBound或小一些启发性知识因此。
一个用例我有被询问与非索引日期的特定时间间隔内记录的大型历史数据集。 在编写查询,我将有是否存在之前指定的时间间隔或指定的时间间隔后更多的数据是个好主意,并可以相应地命令我的比较。 我已经有多达一半取决于数据集的大小,查询的复杂性,并且由第一比较筛选的记录量削减执行时间。
文章来源: SQL : BETWEEN vs <= and >=