Sql-Server
這兩個查詢在邏輯上是等價的嗎?
這兩個查詢在邏輯上是等價的嗎?
DECLARE @DateTime DATETIME = GETDATE()
查詢 1
SELECT * FROM MyTable WHERE Datediff(DAY, LogInsertTime, @DateTime) > 7
查詢 2
SELECT * FROM MyTable WHERE LogInsertTime < @DateTime - 7
如果它們在邏輯上不等價,您能否給我第一個查詢的邏輯等價物,以便 WHERE 子句可以有效地使用索引(即消除函式包裝)?
您發布的兩個查詢在邏輯上是否等效無關緊要;你不應該使用它們中的任何一個。我將嘗試引導您遠離幾件事:
- 只要有可能,盡量避免將函式應用於列。將這些計算保持在常量而不是列上總是一樣好,而且大多更好——這會破壞 SARGability 並使這些列上的索引無用。在這種情況下,我更喜歡查詢 2,特別是如果
LogDateTime
被索引(或可能永遠是)。- 我不喜歡速記日期數學,我建議不要這樣做。當然,鍵入速度更快,但是嘗試使用
DATE
數據類型,你會得到一個醜陋的錯誤。最好把它拼出來,例如:WHERE LogInsertTime < DATEADD(DAY, -7, @DateTime);