Les plans d'exécution sont excellents mais parfois ils ne vous disent tout simplement pas la vérité. Voici donc une preuve basée sur un test de performance.
(et la ligne du bas - l'expression n'est pas évaluée pour chaque ligne)
;with t(i) as (select 0 union all select i+1 from t where i < 9)
select getdate()-1 as col1,getdate() as col2,getdate() as col3
into #t
from t t0,t t1,t t2,t t3,t t4,t t5,t t6,t t7
(100000000 ligne (s) affectée (s))
Il s'agit de la requête OP et son exécution prend environ 12 secondes
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Cette requête qui stocke la date dans un paramètre avant l'exécution, prend environ le même temps, 12 secondes.
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
Et juste pour vérifier les résultats -
Cette requête qui effectue le calcul sur col1 et doit donc recalculer l'expression pour chaque ligne prend environ 30 secondes pour s'exécuter.
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
Toutes les requêtes ont été exécutées à plusieurs reprises montrant les mêmes mesures
GETDATE()
.