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).
- 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")
- 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)