2009-11-20 95 views
4

我记得听到或读书的地方,SQL Server之间的效率不高

SELECT * from TABLE where date >= '2009-01-01' AND date <= '2009-12-31' 

SELECT * from TABLE where date BETWEEN '2009-01-01' AND '2009-12-31' 

凡日期栏是一个DATETIME类型,并且具有相同的索引更加高效。它是否正确?

回答

11

不,这是不正确的。

两种语法都是完全相同的。

BETWEEN只是一个语法糖,用于>= … AND <= …

同样适用于所有主要系统(OracleMySQLPostgreSQL),不仅为SQL Server真正的简写。

不过,如果你想检查日期为当年,你应该使用这样的语法:

date >= '2009-01-01' AND date < '2010-01-01' 

注意,最后一个条件是严格的。

这是BETWEEN语义不同,它是查询本年度(而不是YEAR(date) = 2009这是不优化搜索)的优选方式。

由于最后一个不等式是严格的,并且BETWEEN条件包含范围边界,所以不能将此条件重写为BETWEEN

您需要严格的条件,因为DATETIME的,不像整数,不well-ordered,那就是你不能告诉‘在2009最后可能的日期时间值’(这是不实现特定的,当然)。

+1

回答这些问题的最简单方法是查看两种语句的执行计划。你可能会发现这些计划是相同的成本相同。 – 2009-11-20 18:03:12

+0

一个SQL Server 2012'DATE_TIME'与'01/01/14'之间的'DATE_TIME'是DATE_TIME> = '01/01/2013'和DATE_TIME <'01/01/14'的语法等值“'。两者都是可靠的。 – craig 2014-12-18 14:01:42

+0

@craig:你的意思是'CAST(DATE_TIME AS DATE)'在'01/01/2013'和'01/01/14'中的第一个表达式中吗? – Quassnoi 2014-12-18 14:49:43