Declaración SQL para seleccionar todas las filas del día anterior

120

Estoy buscando una buena declaración SQL para seleccionar todas las filas del día anterior de una tabla. La tabla contiene una columna de fecha y hora. Estoy usando SQL Server 2005.

rudimenter
fuente

Respuestas:

212

hoy no hay tiempo:

SELECT dateadd(day,datediff(day,0,GETDATE()),0)

obtener ayer sin tiempo:

SELECT dateadd(day,datediff(day,1,GETDATE()),0)

consulta para todas las filas de ayer:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)
KM.
fuente
@ashuthinks, tu comentario no tiene sentido para mí. La pregunta original pregunta cómo obtener filas del día anterior. Para hacer eso, necesita poder obtener solo la fecha de hoy (sin hora) y solo la fecha de ayer (sin hora). Utiliza estas fechas (atemporales) en la cláusula` DONDE`. Sin embargo, SELECT *devolverá las fechas con sus horas originales.
KM.
dateiff da "Error de recuento de parámetros incorrecto". y stackoverflow.com/a/18926156/3007408 dice que dateiff solo puede usar 2 parámetros. ¿¿alguna solución??
Sp0T
@ Sp0T, esta pregunta está etiquetada como SQL Server , que tiene una función DATEDIFF () que acepta tres parámetros ( msdn.microsoft.com/en-us/library/ms189794.aspx ) la pregunta a la que enlaza es para MySql, que supongo funciona de manera diferente a como lo ha encontrado. Descubrirá que SQL no es completamente intercambiable, existen muchas diferencias como esta entre diferentes proveedores, especialmente en lo que respecta al manejo de fechas.
KM.
Ohh gracias. No lo sabía. Por cierto, resolví el problema usando "entre curdate () -1 día y curdate ()". Puede ser que también se pueda utilizar en este caso.
Sp0T
1
@RasmusBidstrup, sí. cuando corro SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)obtengo:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.
44

Para obtener el valor "hoy" en SQL:

convert(date, GETDATE())

Para obtener "ayer":

DATEADD(day, -1, convert(date, GETDATE()))

Para obtener "hoy menos X días": cambie -1 por -X.

Entonces, para todas las filas de ayer, obtienes:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())
Konamiman
fuente
El tipo de datos "fecha" no existe en SQL Server 2005. Cuando utilizo la fecha y la hora en su lugar, el valor de la hora permanece y el cálculo no se realiza de 0 a.m. a 12 p.m., sino desde el momento en que ejecuta la consulta
rudimenter
1
Mi error. No vi que estuviera tratando con SQL Server 2005. De hecho, mi código funciona solo para SQL Server 2008.
Konamiman
Siempre pensé que DATEADD (día, ....) era un desperdicio, solo sume o reste el número de días contra la fecha: SELECT GETDATE () - 1
KM.
18

Parece que faltaba la respuesta obvia. Para obtener todos los datos de una tabla (Ttable) donde la columna (DatetimeColumn) es una fecha y hora con una marca de tiempo, se puede utilizar la siguiente consulta:

SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday

Esto se puede cambiar fácilmente a hoy, el mes pasado, el año pasado, etc.

llamame Steve
fuente
3
Este funciona bastante bien, pero es mucho más caro en comparación con el DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)que tiene que evaluar el DATEDIFF () en cada fila
Václav Holuša
10
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
Romancha KC
fuente
Este es el ganador.
TmsKtel
5

Es un hilo muy antiguo, pero aquí está mi opinión. En lugar de 2 cláusulas diferentes, una mayor que y una menor que. Utilizo la siguiente sintaxis para seleccionar registros de una fecha. Si desea un intervalo de fechas, las respuestas anteriores son el camino a seguir.

SELECT * FROM TABLE_NAME WHERE 
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0

En el caso anterior, X será -1 para los registros de ayer

Rahul
fuente
4

No puedo probarlo ahora, pero:

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)
Mark Bell
fuente
3

Esto debería hacerlo:

WHERE `date` = CURDATE() - INTERVAL 1 DAY
candelabro
fuente
1
(Lo siento) pero su respuesta solo es compatible con MySQL, la pregunta es para SQL Server
StefanJCollier
2

En SQL Server, haga lo siguiente:

where cast(columnName as date) = cast(getdate() -1 as date)

Debe convertir ambos lados de la expresión hasta la fecha para evitar problemas con el formato de hora.

Si necesita controlar el intervalo con más detalle, debería intentar algo como:

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)
Mário Meyrelles
fuente
1

Otra forma de decirlo "Ayer" ...

Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))

Es posible que esto no funcione bien el 1 de enero, así como el primer día de cada mes. Pero sobre la marcha es eficaz.

usuario3428292
fuente
1

Bueno, es más fácil convertir la columna de fecha y hora a la fecha y que comparar.

SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) = 
   dateadd(day,0, convert(date, getdate(), 105)) 
Amey P Naik
fuente
0

subdate (ahora (), 1) devolverá la marca de tiempo de ayer El siguiente código seleccionará todas las filas con la marca de tiempo de ayer

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
Dismi Paul
fuente