2009-11-20 69 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