I piani di esecuzione sono fantastici, ma a volte non ti dicono la verità. Quindi ecco una prova basata sul test delle prestazioni.
(e la linea di fondo: l'espressione non viene valutata per ogni riga)
;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 righe interessate)
Questa è la query OP e l'esecuzione richiede circa 12 secondi
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Questa query che memorizza la data in un parametro prima dell'esecuzione richiede circa lo stesso tempo, 12 secondi.
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
E solo per verificare i risultati -
Questa query che esegue il calcolo su col1 e quindi deve ricalcolare l'espressione per ogni riga richiede circa 30 secondi per l'esecuzione.
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
Tutte le query sono state eseguite ripetutamente mostrando le stesse metriche
GETDATE()
.