在where子句中使用“And”和“Between”有什么区别?

时间:2014-09-18 12:13:47

标签: sql sql-server tsql

我正在使用这些陈述

DECLARE @FirstDayofPrevMonth datetime
SET @FirstDayofPrevMonth = DATEADD(mm, DATEDIFF(m,0,GETDATE())-1,0)
DECLARE @LastDayofPrevMonth datetime
SET @LastDayofPrevMonth = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))  

然后在where子句中使用它们:

WHERE FNDate    >= @FirstDayofPrevMonth AND FNDate <= @LastDayofPrevMonth

使用“Between”的原因是什么?

5 个答案:

答案 0 :(得分:4)

BETWEEN实际上与>=<=完全相同。

请注意,尽管键入较少,但可能会导致错误的结果。

很多时候,您希望在一个日期内获得结果。你会写:

WHERE DateTimeField BETWEEN '20140918' AND '20140919'

在这种情况下,假设表中有以下条目:

1 '20140918 23:59:59'
2 '20140919 00:00:00'
3 '20140919 00:00:01'

上面的where语句会获得条目1和2.因此,虽然在大多数情况下您会得到正确的结果,但使用以下内容更安全:< / p>

WHERE DateTimeField >='20140918' AND DateTimeField < '20140919'

答案 1 :(得分:2)

如果您显示的是绝对没有理由使用BETWEEN:这两个表达式在功能上是等效的。

BETWEEN的一个好例子是左边的值是评估表达式或参数引用的结果,例如

WHERE @AsOfDate BETWEEN t.ActiveFrom AND t.ActiveTo

WHERE DATEADD(day, t.DaysToDeliver, t.OrderDate) BETWEEN @BlackoutBegin AND @BlackoutEnd

此处,等效的>=<=对需要重复WHERE子句的一部分,这与BETWEEN运算符不同。

答案 2 :(得分:2)

没有什么区别,只有那个可以被认为更容易阅读。

例如,人们可以争辩说:

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

比以下更容易阅读:

SELECT column_name(s)
FROM table_name
WHERE column_name >=value1 AND column_name <=value2;

否则,没有太大的区别。当然,除了更多的打字(感谢杰克);)

有些人仍然不同意,尽管他们不喜欢&#39; BETWEEN&#39;条款,因为日期/等等有时会很棘手。但是,与所有代码一样,它的设计是出于某种原因。而且,如果使用得当,可能会非常有帮助!

有些人会日夜争辩说他们会使用AND条款 - 这可能只是让他们更频繁地了解/使用它,并且已经习惯了它的小小的&#39;调整和扭曲&#39; - 因此他们没有尽可能多地使用BETWEEN声明。

但是,如果他们首先使用BETWEEN语句(在他们知道AND语句是什么之前),那么他们就会有不同的争论。

但是,与所有代码一样,请充分利用它,并且您将学会使用它 - 甚至可能会想到&#39;我之前是如何使用它的。

修改

显然有些人在谈论&#39;是否包含/排除&#39;,我想我可能会添加这个(从我下面的评论中复制):

少打字可能并不总是新手的答案,但是知道他们正在做什么的人,这可能会非常有帮助! (我不是任何一个职业选手) - 但对我而言,这意味着排他性。但是,是的,我知道人们来自哪里,例如选择1到10之间的数字。英语中的整个单词有一些含糊不清!

如果您想阅读更多内容,可以在blog帖子中谈论&#34;糟糕的习惯:错误处理日期/范围查询&#34;

This&#34;了解如何使用SQL BETWEEN条件及语法和示例进行了一些解释&#34;

就个人而言,我更愿意保留使用 Between 语句,比如说,员工ID,其中值是ints / etc,而不是日期(这纯粹是首选,如两者都可以“使用”。

答案 3 :(得分:2)

之间的关键字&lt; =或&gt; = 没有区别。他们会给出相同的结果。 但两者之间只是为了可读的目的,也不要重复列名。

select * from table_name where column_name between '2014-01-01' and '2014-01-31';

select * from table_name where column_name>='2014-01-01' and date<='2014-01-31';

您可以在上面的查询中看到它们会给出相同的结果,但之间的是可读格式。

答案 4 :(得分:0)

我记得,没有区别。但请亲自看看:

SELECT * FROM `table` WHERE `date` BETWEEN 12917700 AND 12917300
and:


SELECT * FROM `table` WHERE `date` >= 12917700 AND `date` <= 12917300

产生相同的结果。