2011-06-08 19 views
13

Quiero seleccionar todos los registros de una tabla Log donde los valores de campo DateAndTime (del tipo datetime) son para el día anterior hoy, cualquiera que sea el día.TSQL SELECCIONAR registros de la fecha anterior

Así que si hoy es 2011-06-08, quiero seleccionar todas las filas donde DateAndTime es mayor o igual que 2011-06-07 00:00:00 y también menos que 2011-06-08 00:00:00.

Supongo que la trampa potencial aquí sería su comportamiento el primer día del mes, ya que obviamente una fecha como 2011-06-00 no es válida, y debería ser 2011-05-31.

Respuesta

22

Para SQL Server 2008 puede utilizar este.

select * 
from [log] 
where cast(DateAndTime as date) = cast(getdate()-1 as date) 

Pre 2008 se puede utilizar esta

select * 
from [log] 
where DateAndTime >= dateadd(d, datediff(d, 0, getdate())-1, 0) and 
     DateAndTime < dateadd(d, datediff(d, 0, getdate()), 0) 

relacionados en DBA: Cast to date is sargable but is it a good idea?

+1

Fundir la columna podría tener serias implicaciones de rendimiento, ver la solución de JanW debajo de –

+0

@AdriaanDavel Sí, sí, con estimaciones de cardinalidad. No con sargabilidad. ¿Leyó la pregunta sobre el DBA vinculada desde mi respuesta? –

3
SELECT * FROM Log 
WHERE DateAndTime >= DATEADD(DAY,-1, CAST(GETDATE() AS DATE)) 
AND DateAndTime < CAST(CAST(GETDATE() AS DATE) AS DATETIME) 
1

este ejemplo se supone SQL Server:

select * 
from log 
where convert(varchar(8), DateAndTime , 112) = convert(varchar(8), getdate()-1, 112) 

Esencialmente, convertir la fecha para el aaaammdd (el parámetro 112) y luego comprobar que es igual a la fecha de ayer (getdate()-1), también convierte en el aaaammdd.

0

Suponiendo SQL Server

declare @today date 
set @today = GETDATE() 

select * from Log where DateAndTime between DATEADD(dd, -1, @today) and @today 
0

Debe incluir operador condicional y no entre. De lo contrario, también incluye los registros de hoy.

Declare @today date 
Set @today = GETDATE() 


Select YourcolumnNames from log 
Where DateAndTime >= DATEADD(dd, -1, @today) and DateAndTime < DATEADD(dd, -1, @today) 

Además, debe mencionar el nombre de la columna y * debe evitarse en la instrucción de selección. Esto puede mejorar el rendimiento

Cuestiones relacionadas