SQL-Anweisung zum Auswählen aller Zeilen vom Vortag

120

Ich suche eine gute SQL-Anweisung, um alle Zeilen des Vortages aus einer Tabelle auszuwählen. Die Tabelle enthält eine Datums- / Uhrzeitspalte. Ich verwende SQL Server 2005.

Rudimenter
quelle

Antworten:

209

bekomme heute keine zeit:

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

bekomme gestern keine zeit:

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

Abfrage für alle Zeilen von erst gestern:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)
KM.
quelle
@ashuthinks, dein Kommentar macht für mich keinen Sinn. In der ursprünglichen Frage wird gefragt, wie Zeilen vom Vortag abgerufen werden sollen. Dazu müssen Sie nur das heutige Datum (keine Uhrzeit) und nur das gestrige Datum (keine Uhrzeit) abrufen können. Sie verwenden diese (zeitlosen) Daten in der WHERE-Klausel. Die SELECT *Daten werden jedoch mit ihren ursprünglichen Zeiten zurückgegeben.
KM.
datiert gibt "Falscher Parameterzählfehler" an. und stackoverflow.com/a/18926156/3007408 besagt, dass datiert nur 2 Parameter verwenden kann. irgendeine Lösung??
Sp0T
@ Sp0T, diese Frage ist mit SQL Server gekennzeichnet , das über eine DATEDIFF () -Funktion verfügt, die drei Parameter akzeptiert ( msdn.microsoft.com/en-us/library/ms189794.aspx ). Die Frage, auf die Sie verlinken, bezieht sich auf MySql funktioniert anders als du gefunden hast. Sie werden feststellen, dass SQL nicht vollständig austauschbar ist. Es gibt viele solche Unterschiede zwischen verschiedenen Anbietern, insbesondere in Bezug auf die Datumsbehandlung.
KM.
Oh Danke. Wusste das nicht. Übrigens habe ich das Problem mit "zwischen curdate () -1 Tag und curdate ()" gelöst. Möglicherweise kann es auch in diesem Fall verwendet werden.
Sp0T
1
@RasmusBidstrup, ja. Wenn ich renne, SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)bekomme ich:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.
44

So erhalten Sie den "Heute" -Wert in SQL:

convert(date, GETDATE())

Um "gestern" zu bekommen:

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

Um "heute minus X Tage" zu erhalten: Ändern Sie -1 in -X.

Für alle Zeilen von gestern erhalten Sie also:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())
Konamiman
quelle
„date“ Datentyp doesnt exist in SQL Server 2005. Wenn ich Datetime , anstatt die Zeit Wert bleibt und die Berechnung erfolgt von 00.00 bis 12.00 Uhr nicht aber von dem der Zeit laufen Sie den Query
rudimenter
1
Mein Fehler. Ich habe nicht gesehen, dass Sie mit SQL Server 2005 zu tun haben. In der Tat funktioniert mein Code nur für SQL Server 2008.
Konamiman
Ich habe immer gedacht, dass DATEADD (Tag, ....) eine Verschwendung ist. Addiere oder subtrahiere einfach die Anzahl der Tage zum Datum: SELECT GETDATE () - 1
KM.
18

Es scheint, dass die offensichtliche Antwort fehlte. Um alle Daten aus einer Tabelle (Ttable) abzurufen, in der die Spalte (DatetimeColumn) eine Datumszeit mit einem Zeitstempel ist, kann die folgende Abfrage verwendet werden:

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

Dies kann leicht auf heute, letzten Monat, letztes Jahr usw. geändert werden.

Nenn mich Steve
quelle
3
Dieser funktioniert ziemlich gut, ist aber viel teurer DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)als der DATEDIFF () in jeder Zeile
Václav Holuša
10
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
Romancha KC
quelle
Dies ist der Gewinner.
TmsKtel
5

Es ist ein wirklich alter Thread, aber hier ist meine Meinung dazu. Anstelle von 2 verschiedenen Klauseln, eine größer als und kleiner als. Ich verwende diese Syntax unten, um Datensätze aus einem Datum auszuwählen. Wenn Sie einen Datumsbereich wünschen, sind vorherige Antworten der richtige Weg.

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

Im obigen Fall ist X für die gestrigen Datensätze -1

Rahul
quelle
4

Ich kann es momentan nicht testen, aber:

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

Dies sollte es tun:

WHERE `date` = CURDATE() - INTERVAL 1 DAY
Candlejack
quelle
(Sorry) aber deine Antwort ist nur MySQL kompatibel, die Frage ist für SQL Server
StefanJCollier
2

Gehen Sie in SQL Server folgendermaßen vor:

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

Sie sollten beide Seiten des Ausdrucks auf den neuesten Stand bringen, um Probleme mit der Zeitformatierung zu vermeiden.

Wenn Sie das Intervall genauer steuern müssen, sollten Sie Folgendes ausprobieren:

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
quelle
1

Eine andere Möglichkeit, es "Gestern" zu sagen ...

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

Dies funktioniert möglicherweise nicht gut am 1. Januar sowie am ersten Tag eines jeden Monats. Aber im laufenden Betrieb ist es effektiv.

user3428292
quelle
1

Nun, es ist einfacher, die datetime-Spalte auf den neuesten Stand zu bringen und zu vergleichen.

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

subdate (now (), 1) gibt den Zeitstempel von gestern zurück. Der folgende Code wählt alle Zeilen mit dem gestrigen Zeitstempel aus

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