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

Come confrontare datetime con la sola data in SQL Server

NON essere tentato di fare cose come questa:

Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'

Questo è un modo migliore:

Select * from [User] U 
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')

vedi:cosa significa veramente la parola "SARGable"?

EDIT +Ci sono 2 ragioni fondamentali per evitare l'uso di funzioni sui dati nella clausola where (o nelle condizioni di join).

  1. Nella maggior parte dei casi, l'utilizzo di una funzione sui dati da filtrare o unire rimuove la capacità dell'ottimizzatore di accedere a un indice su quel campo, rendendo così la query più lenta (o più "costosa")
  2. L'altro è che per ogni riga di dati coinvolta viene eseguito almeno un calcolo. Potrebbe essere l'aggiunta di centinaia, migliaia o molti milioni di calcoli alla query in modo da poter confrontare un singolo criterio come 2014-02-07 . È invece molto più efficiente modificare i criteri per adattarli ai dati.

"Modificare i criteri per adattarli ai dati" è il mio modo di descrivere "usa SARGABLE predicati"

E non usare tra nessuno dei due.

la migliore pratica con intervalli di data e ora è evitare TRA e utilizzare sempre il modulo:

WHERE col>='20120101' AND col <'20120201' Questo modulo funziona con tutti i tipi e tutte le precisioni, indipendentemente dal fatto che la parte temporale sia applicabile.

http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)