2011-03-10 14 views
8

Me estoy haciendo una consulta de la siguiente manera:DateDifference SQL en una cláusula where

SELECT 
    * 
FROM a 
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3; 

y no funciona

Yo estoy tratando de obtener los datos que es de no más de 3 días.

SQL server.

¿Cómo hacer esto?

DATEDIFF trabaja demasiado lento ..

Respuesta

24

DateDiff es extremadamente rápido ... Su problema es que lo está ejecutando en el valor de columna de la tabla de base de datos, por lo que el procesador de consultas debe ejecutar la función en cada fila de la tabla, incluso si hubo un índice en esta columna. Esto significa que tiene que cargar toda la tabla desde el disco.

En su lugar, utilice la función dateAdd en la fecha de hoy y compare la columna de la tabla de la base de datos con el resultado de ese único cálculo. Ahora solo ejecuta DateAdd() una vez, y puede usar un índice (si existe) para cargar solo las filas que coinciden con el criterio de predicado.

Where a.DateValue > DateAdd(day,-3,getdate())

hacer esto de esta manera hace que su predicado de consulta SARG-able

+0

SARG-poder, que no había oído antes. ¡Gracias! –

+0

'el procesador de consultas debe ejecutar la función en cada fila de la tabla' me ayudó a entender y resolver un problema que tenía cuando la misma declaración DATEDIFF se quejaba de un desbordamiento en la cláusula WHERE pero no en SELECT. –

+0

Estaba teniendo problemas con una subconsulta que usa un DATEDIFF con un sitio que me vuelve loco, tu solución fue excelente y realmente me ayudó. Muchas gracias. – FabianSilva

0

Su consulta no parece mala. Otra forma de abordar sería:

SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE()) 
Cuestiones relacionadas