Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Confronta le date in T-SQL, ignorando la parte del tempo

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.