Wie wähle ich Datensätze aus den letzten 24 Stunden mit SQL aus?

184

Ich suche nach einer whereKlausel, mit der Datensätze der letzten 24 Stunden abgerufen werden können.

Mike
quelle
1
Haben Sie ein Zeitstempelfeld in diesen Datensätzen?
Shawn Steward

Antworten:

100
SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
Guillaume Flandre
quelle
6
Wenn die Datensätze als gespeichert werden DATETIME, werden alle Datensätze vom vorherigen Datum ausgewählt, wobei der Zeitteil nicht berücksichtigt wird. Wurde ausgeführt 23:59:59, gibt die Abfrage alle Datensätze der letzten 48Stunden zurück, nicht 24.
Quassnoi
18
Wenn Sie die letzten 24 Stunden aus einem Datum / Uhrzeit-Feld auswählen möchten, ersetzen Sie 'curate ()' durch 'now ()'. Dies beinhaltet auch die Zeit.
Haentz
562

In MySQL:

SELECT  *
FROM    mytable
WHERE   record_date >= NOW() - INTERVAL 1 DAY

In SQL Server:

SELECT  *
FROM    mytable
WHERE   record_date >= DATEADD(day, -1, GETDATE())

In Oracle:

SELECT  *
FROM    mytable
WHERE   record_date >= SYSDATE - 1

In PostgreSQL:

SELECT  *
FROM    mytable
WHERE   record_date >= NOW() - '1 day'::INTERVAL

In Redshift:

SELECT  *
FROM    mytable
WHERE   record_date >= GETDATE() - '1 day'::INTERVAL

In SQLite:

SELECT  *
FROM    mytable
WHERE   record_date >= datetime('now','-1 day')

In MS Access:

SELECT  *
FROM    mytable
WHERE   record_date >= (Now - 1)
Quassnoi
quelle
3
Ich versuche die Abfrage für MySQL, aber wenn es zum Beispiel 2 Uhr morgens ist, bekomme ich die Datensätze von 00 bis 02 Uhr. Nur zwei Stunden statt 24. Irgendwelche Ideen?
Manos
Die hier bereitgestellte Lösung gefällt mir sehr gut. In MySQL habe ich festgestellt, dass die Leistung der Guillaume Flandre- Lösung schneller war.
oneworld
1
In Amazon Redshift bekomme ich function getdate() does not exist. Ersetzte es durch current_dateund es funktionierte gut.
FloatingRock
1
Diese Antwort lässt mich wünschen, es gäbe einen "Stern" -Button, da ich dies als Lesezeichen speichern möchte.
Brian Risk
1
@Manos In MySQL sieht es so aus, als würde CURDATE()kein Datum mit einem Zeitanteil zurückgegeben , also geht es zu 00. Ich habe es behoben, indem ich NOW()anstelle von verwendet habe CURDATE().
4castle
21

MySQL:

SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(NOW(), INTERVAL 24 HOUR)

Das Intervall kann in JAHR, MONAT, TAG, STUNDE, MINUTE, ZWEIT sein

Zum Beispiel in den letzten 10 Minuten

SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(NOW(), INTERVAL 10 MINUTE)
Karthik Jayapal
quelle
3
Dies ist die Antwort, die die spezifische Frage am besten beantwortet: Wie werden die VORHERIGEN 24 STUNDEN (ab dem gegenwärtigen Moment) zurückgegeben, im Gegensatz zu den vorherigen 24 (die alle Ergebnisse für den vorherigen Tag vorschlagen)? Dies hat meine Anforderungen erfüllt, dies hat meine positive Bewertung erhalten. BEARBEITEN: Erwähnenswert ist der Tabellenname. Die Spalte "Datum" sollte ein Zeitstempel sein.
Anthony Cregan
8

Welches SQL nicht angegeben wurde, SQL 2005/2008

SELECT yourfields from yourTable WHERE yourfieldWithDate > dateadd(dd,-1,getdate())

Wenn Sie sich für Datumsarten mit erhöhter Genauigkeit von 2008 befinden, verwenden Sie stattdessen die neue Funktion sysdatetime (), ebenso wenn Sie UTC-Zeiten verwenden, die intern zu den UTC-Aufrufen wechseln.

Andrew
quelle
7

In Postgres wird davon ausgegangen, dass Ihr Feldtyp ein Zeitstempel ist:

Wählen Sie * aus der Tabelle aus, in der date_field> (now () - Intervall '24 Stunde ');

pisaruk
quelle
4

Wenn der betrachtete Zeitstempel ein UNIX-Zeitstempel ist, müssen Sie zuerst den UNIX-Zeitstempel (z. B. 1462567865) in einen MySQL-Zeitstempel oder Daten konvertieren

SELECT * FROM `orders` WHERE FROM_UNIXTIME(order_ts) > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
aufleuchten
quelle
Dies setzt voraus, dass die verwendete Engine MySQL ist, da FROM_UNIXTIME () eine MySQL-Funktion ist. Für SQL Server-Verwendung: SELECT DATEDIFF(s, '1970-01-01 00:00:00', DateField) Wenn Sie in SQL Server 2016 und höher eine Millisekundengenauigkeit benötigen, verwenden Sie: SELECT DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', DateField)
luisdev
3
select ...
from ...
where YourDateColumn >= getdate()-1
Mladen Prajdic
quelle
2

Hallo, ich habe jetzt viel Zeit vom ursprünglichen Beitrag vergangen, aber ich habe ein ähnliches Problem und möchte es teilen.

Ich habe ein Datum / Uhrzeit-Feld mit diesem Format JJJJ-MM-TT hh: mm: ss und möchte einen ganzen Tag darauf zugreifen. Hier ist meine Lösung.

Die Funktion DATE () in MySQL: Extrahieren Sie den Datumsteil eines Datums- oder Datums- / Uhrzeitausdrucks.

SELECT * FROM `your_table` WHERE DATE(`your_datatime_field`)='2017-10-09'

Damit bekomme ich das ganze Zeilenregister an diesem Tag.

Ich hoffe es hilft jemandem.

Rafa cosquiere
quelle
Dies ist die einzige, die für mich unter mySQL funktioniert hat. Aus irgendeinem Grund, als ich SELECT * FROM myTable WHERE myDate> DATE_SUB ('2018-06-13 00:00:00', INTERVAL 24 HOUR) versuchte; Ich habe immer noch Aufzeichnungen vom 14.06.2018 bekommen.
jDub9
1
SELECT * 
FROM tableName 
WHERE datecolumn >= dateadd(hour,-24,getdate())
Galwegisch
quelle
1

In SQL Server (für die letzten 24 Stunden):

SELECT  *
FROM    mytable
WHERE   order_date > DateAdd(DAY, -1, GETDATE()) and order_date<=GETDATE()
arunkumar.halder
quelle
2
Warum sollten Sie "and order_date <= GETDATE ()" hinzufügen müssen, wenn Sie bereits nach den letzten 24 Stunden ab dem Zeitpunkt der Prüfung dieser Abfrage suchen? Es macht wirklich keinen Sinn, diesen Teil in der where-Klausel zu haben, wenn Sie "GETDATE" bereits im ersten erwähnt haben. Du machst es besser "order_date> = DateAdd (DAY, -1, GETDATE ())" das war's!
KMX