Il modo più ragionevole per farlo è eliminare la parte temporale dei valori datetime e confrontare i risultati, e il modo migliore per rimuovere la parte temporale da un datetime è questo:
cast(current_timestamp as date)
Usavo e sostenevo un processo che assomigliava a una delle due righe seguenti:
cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
Ma ora che Sql Server ha il Date
tipo, che non contiene una componente temporale, ci sono poche ragioni per utilizzare nessuna di queste tecniche.
Un'altra cosa da tenere a mente è che questo impantanerà comunque una query se è necessario farlo per due valori datetime per ogni riga in una clausola where o in una condizione di join. Se possibile, vuoi tenerlo in considerazione in qualche modo in modo che sia precalcolato il più possibile, ad esempio utilizzando una vista o una colonna calcolata.
Infine, nota che la funzione DATEDIFF confronta il numero di confini attraversati. Ciò significa la differenza di data in giorni tra '2009-09-14 11:59:59'
e '2009-09-15 00:00:01'
è 1, anche se sono trascorsi solo 2 secondi, ma il DATEDIFF nei giorni compresi tra '2009-09-15 00:00:01'
e '2009-09-15 11:59:59'
è ancora zero, anche se sono trascorsi 86.398 secondi. Non si preoccupa affatto della porzione di tempo lì, solo dei confini. A seconda di ciò che la tua richiesta sta cercando di fare, potresti essere in grado di sfruttarla a tuo vantaggio.