Come selezionare i record delle ultime 24 ore usando SQL?


185

Sto cercando una whereclausola che può essere utilizzata per recuperare i record nelle ultime 24 ore?


1
Hai un campo timestamp su questi record?
Shawn Steward,

Risposte:


101
SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)

6
Se i record sono archiviati come DATETIME, verranno selezionati tutti i record dalla data precedente, ignorando la parte temporale. Stato eseguito 23:59:59, la query restituirà tutti i record per le ultime 48ore, no 24.
Quassnoi,

18
Se si desidera selezionare le ultime 24 ore da un campo datetime, sostituire 'curate ()' con 'now ()'. Questo include anche il tempo.
Haentz,

564

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)

3
Provo la query per mysql ma se è la 2AM, per esempio, ottengo i record dalle 00 alle 02 AM. Solo due ore invece di 24. Qualche idea?
Manos,

Mi piace molto la soluzione fornita qui, proprio quello che ho notato in MySQL è che le prestazioni della soluzione Guillaume Flandre sono state più veloci.
oneworld,

1
In Amazon Redshift, ottengo function getdate() does not exist. Sostituito con current_datee ha funzionato bene.
FloatingRock,

1
Questa risposta mi fa desiderare che ci sia un pulsante "a stella" mentre voglio aggiungere un segnalibro.
Brian Risk,

1
@Manos In MySQL, sembra CURDATE()che non ritorni una data con una porzione di tempo, quindi va a 00. Ho risolto usando NOW()invece di CURDATE().
4castle,

21

MySQL:

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

L'INTERVALLO può essere in ANNO, MESE, GIORNO, ORA, MINUTI, SECONDI

Ad esempio, negli ultimi 10 minuti

SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(NOW(), INTERVAL 10 MINUTE)

3
Questa è la risposta che risponde meglio alla domanda specifica: come restituire le 24 ORE PRECEDENTI (dal momento presente), al contrario delle 24 precedenti (che suggeriscono tutti i risultati per il giorno precedente). Questo ha risposto ai miei requisiti, questo ha ottenuto il mio voto. EDIT: vale la pena menzionare la colonna table_name.the_date dovrebbe essere un timestamp.
Anthony Cregan,

8

Quale SQL non è stato specificato, SQL 2005/2008

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

Se utilizzi i tipi di data di maggiore accuratezza del 2008, utilizza invece la nuova funzione sysdatetime (), allo stesso modo se utilizzi gli orari UTC scambia internamente con le chiamate UTC.


7

in postgres, supponendo che il tipo di campo sia un timestamp:

seleziona * dalla tabella dove date_field> (now () - intervallo '24 hour ');


4

Se il timestamp considerato è un timestamp UNIX È necessario prima convertire il timestamp UNIX (ad es. 1462567865) in timestamp o dati mysql

SELECT * FROM `orders` WHERE FROM_UNIXTIME(order_ts) > DATE_SUB(CURDATE(), INTERVAL 1 DAY)

Ciò presuppone che il motore utilizzato sia MySQL poiché FROM_UNIXTIME () è una funzione MySQL. Per l'uso di SQL Server: SELECT DATEDIFF(s, '1970-01-01 00:00:00', DateField) se è necessaria un'accuratezza di millisecondi in SQL Server 2016 e versioni successive: SELECT DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', DateField)
luisdev


2

Ciao, ora sono passato molto tempo dal post originale, ma ho avuto un problema simile e voglio condividere.

Ho un campo datetime con questo formato AAAA-MM-GG hh: mm: ss e voglio accedere a un'intera giornata, quindi ecco la mia soluzione.

La funzione DATE (), in MySQL: estrae la parte data di un'espressione data o datetime.

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

con questo ottengo tutti i registri delle righe in questo giorno.

Spero che possa aiutare chiunque.


Questo è l'unico che ha funzionato per me su mySQL. Per qualche motivo quando ho provato SELEZIONA * DA myTable DOVE myDate> DATE_SUB ('2018-06-13 00:00:00', INTERVAL 24 HOUR); Stavo ancora ottenendo record dal 14/06/2018.
jDub9,

1
SELECT * 
FROM tableName 
WHERE datecolumn >= dateadd(hour,-24,getdate())

1

In SQL Server (per le ultime 24 ore):

SELECT  *
FROM    mytable
WHERE   order_date > DateAdd(DAY, -1, GETDATE()) and order_date<=GETDATE()

2
perché dovresti aggiungere "e order_date <= GETDATE ()" quando stai già cercando le ultime 24 ore dal momento in cui è stata eseguita la query? Non ha davvero senso avere quella parte nella clausola where quando hai "GETDATE" già menzionato nel primo. È meglio che lo faccia "order_date> = DateAdd (DAY, -1, GETDATE ())" questo è tutto!
KMX,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.