sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo comparar fecha y hora con solo fecha en SQL Server

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

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