Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como comparar datetime apenas com data no SQL Server


NÃO fique tentado a fazer coisas assim:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'

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

veja:O que a palavra “SARGable” realmente significa?

EDIT +Existem 2 razões fundamentais para evitar o uso de funções em dados na cláusula where (ou em condições de junção).
  1. Na maioria dos casos, usar uma função nos dados para filtrar ou unir remove a capacidade do otimizador de acessar um índice nesse campo, tornando a consulta mais lenta (ou mais "caro")
  2. A outra é que para cada linha de dados envolvida há pelo menos um cálculo sendo executado. Isso pode incluir centenas, milhares ou muitos milhões de cálculos à consulta para que possamos comparar com um único critério como 2014-02-07 . É muito mais eficiente alterar os critérios para adequá-los aos dados.

"Alterar os critérios para se adequar aos dados" é minha maneira de descrever "use SARGABLE predicados"

E não use entre ambos.

a melhor prática com intervalos de data e hora é evitar BETWEEN e sempre usar o formulário:

WHERE col>='20120101' AND col <'20120201' Este formulário funciona com todos os tipos e todas as precisões, independentemente de a parte do tempo ser aplicável.

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