Los planes de ejecución son geniales, pero a veces simplemente no te dicen la verdad. Así que aquí hay una prueba basada en la prueba de rendimiento.
(y el resultado final: la expresión no se evalúa para cada fila)
;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 filas afectadas)
Esta es la consulta OP y tarda unos 12 segundos en ejecutarse
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Esta consulta que almacena la fecha en un parámetro antes de la ejecución, toma aproximadamente el mismo tiempo, 12 segundos.
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
Y solo para verificar los resultados:
esta consulta que realiza el cálculo en col1 y, por lo tanto, tiene que volver a calcular la expresión para cada fila, tarda aproximadamente 30 segundos en ejecutarse.
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
Todas las consultas se ejecutaron repetidamente mostrando las mismas métricas
GETDATE()
.