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.

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)

@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())

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.


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


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


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)

3

Esto debería hacerlo:

WHERE `date` = CURDATE() - INTERVAL 1 DAY

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)

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.


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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.