AdventureWorks を使用して、次の 2 つの同等のクエリを見ると、次のようになります。
SELECT OrderDate FROM Sales.SalesOrderHeader
WHERE DATEDIFF(month,OrderDate,GETDATE()) BETWEEN 1 AND 7;
SELECT OrderDate FROM Sales.SalesOrderHeader
WHERE OrderDate >= DATEADD(MONTH, -7, GETDATE())
AND OrderDate <= DATEADD(MONTH, -1, GETDATE());
どちらの場合も、クラスター化インデックス スキャンが表示されます。

ただし、後者のクエリでのみ推奨/不足しているインデックスに注意してください。

OrderDate 列にインデックスを追加した場合は、クエリを再度実行します。
CREATE INDEX dt ON Sales.SalesOrderHeader(OrderDate);
GO
SELECT OrderDate FROM Sales.SalesOrderHeader
WHERE DATEDIFF(month,OrderDate,GETDATE()) BETWEEN 1 AND 7;
SELECT OrderDate FROM Sales.SalesOrderHeader
WHERE OrderDate >= DATEADD(MONTH, -7, GETDATE())
AND OrderDate <= DATEADD(MONTH, -1, GETDATE());
多くの違いが見られます - 後者はシークを使用します:


お使いのバージョンのクエリの推定値がどのようにずれているかも注目してください。これは、大規模なデータ セットでは絶対に悲惨な結果になる可能性があります。
列に適用される関数またはその他の式がサージ可能になるケースはほとんどありません。私が知っている 1 つのケースはCONVERT(DATE, datetime_column)
- しかし、その特定の最適化は文書化されていません。列に対して関数/式を使用しても問題ないことを暗黙のうちに示唆しているという理由だけでなく (他のすべてのシナリオではそうではありません)、無駄な読み取りや悲惨な見積もりにつながる可能性があるためです。