Sql-Server

這兩個查詢在邏輯上是等價的嗎?

  • November 1, 2014

這兩個查詢在邏輯上是等價的嗎?

DECLARE @DateTime DATETIME = GETDATE()

查詢 1

SELECT *
FROM   MyTable
WHERE  Datediff(DAY, LogInsertTime, @DateTime) > 7   

查詢 2

SELECT *
FROM   MyTable
WHERE  LogInsertTime < @DateTime - 7 

如果它們在邏輯上不等價,您能否給我第一個查詢的邏輯等價物,以便 WHERE 子句可以有效地使用索引(即消除函式包裝)?

您發布的兩個查詢在邏輯上是否等效無關緊要;你不應該使用它們中的任何一個。我將嘗試引導您遠離幾件事:

  1. 只要有可能,盡量避免將函式應用於列。將這些計算保持在常量而不是列上總是一樣好,而且大多更好——這會破壞 SARGability 並使這些列上的索引無用。在這種情況下,我更喜歡查詢 2,特別是如果LogDateTime被索引(或可能永遠是)。
  2. 我不喜歡速記日期數學,我建議不要這樣做。當然,鍵入速度更快,但是嘗試使用DATE數據類型,你會得到一個醜陋的錯誤。最好把它拼出來,例如:
WHERE LogInsertTime < DATEADD(DAY, -7, @DateTime);

引用自:https://dba.stackexchange.com/questions/27100