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.

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)

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

„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.


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


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


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)

4

Dies sollte es tun:

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

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

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.


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

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.