2012-02-14 15 views
5

Necesito todos los registros del último día?cómo obtener registros del día anterior usando tsql?

Hola

Select * from table1 where tabledate > getdate() -1 

con esta consulta, necesito ejecutar está exactamente después de la medianoche para obtener un resultado exacto. Necesito ejecutarlo durante el día y obtener todos los registros del día anterior.

+0

Posible duplicado de [sentencia SQL para seleccionar todas las filas de día anterior] (https://stackoverflow.com/questions/1503298/sql-statement-to-select -all-rows-from-previous-day) –

Respuesta

7

En SQL Server 2005, esto es generalmente la forma más rápida para convertir una fecha y hora a una fecha:

DATEADD(day, DATEDIFF(day, 0, yourDate), 0) 

En su caso, ya está hecho sólo una vez, por lo que la forma en realidad no importa mucho. Pero da la siguiente consulta.

Select 
    * 
from 
    table1 
where 
     tabledate >= DATEADD(day, DATEDIFF(day, 0, getDate()) - 1, 0) 
    AND tabledate < DATEADD(day, DATEDIFF(day, 0, getDate()),  0) 
0

Otro método es utilizar DATEDIFF solo:

SELECT * FROM table1 
WHERE DATEDIFF(DAY, tabledate, GETDATE()) = 1 

A datediff de 1 para el día cubre cualquier momento en el día anterior.

+3

Y también aplastará al optimizador con una gran roca. Si el campo 'tabledate' está indexado, esta versión * no * podrá usar una búsqueda de rango en el índice. En su lugar, tendrá que *** escanear *** el índice completo calculando el DATEDIFF() en cada valor único. Esto se debe a que el campo que se busca ahora está oculto dentro de su llamada de función. La alternativa es un poco más larga, pero mantiene todas las llamadas de función en constantes, y así permite una búsqueda *** mucho más rápida. – MatBailie

+0

De hecho, touche. +1 en – Bort

0
DECLARE @d SMALLDATETIME; 
SET @d = DATEDIFF(DAY, 0, GETDATE()); 

SELECT <cols> FROM dbo.table1 
    WHERE tabledate >= DATEADD(DAY, -1, d) 
    AND tabledate < @d; 
0

Prueba esto:

your_field = cast(dateadd(D,-1,getdate()) as DATE) 
Cuestiones relacionadas