NO caiga en la tentación de hacer cosas como esta:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Esta es una mejor manera:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
ver:¿Qué significa realmente la palabra "SARGable"?
EDITAR +Hay 2 razones fundamentales para evitar el uso de funciones en datos en la cláusula where (o en condiciones de unión).
- En la mayoría de los casos, el uso de una función en los datos para filtrar o unir elimina la capacidad del optimizador para acceder a un índice en ese campo, lo que hace que la consulta sea más lenta (o más "costosa")
- La otra es que, por cada fila de datos involucrados, se está realizando al menos un cálculo. Eso podría ser agregar cientos, miles o muchos millones de cálculos a la consulta para que podamos comparar con un solo criterio como
2014-02-07
. Es mucho más eficiente modificar los criterios para adaptarlos a los datos.
"Modificar los criterios para adaptarlos a los datos" es mi forma de describir "usar SARGABLE
predicados"
Y no use entre ninguno de los dos.
la mejor práctica con rangos de fecha y hora es evitar BETWEEN y usar siempre el formulario:
WHERE col>='20120101' AND col <'20120201' Este formulario funciona con todos los tipos y todas las precisiones, sin importar si la parte de tiempo es aplicable.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)