Como selecionar registros das últimas 24 horas usando SQL?

185

Estou procurando uma wherecláusula que possa ser usada para recuperar registros nas últimas 24 horas?

Mike
fonte
1
Você tem um campo de carimbo de data / hora nesses registros?
Shawn Steward

Respostas:

101
SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
Guillaume Flandre
fonte
6
Se os registros estiverem armazenados como DATETIME, isso selecionará todos os registros da data anterior, desconsiderando a parte da hora. Executada em 23:59:59, a consulta retornará todos os registros nas últimas 48horas, não 24.
Quassnoi
18
Se você deseja selecionar as últimas 24 horas de um campo de data e hora, substitua 'curate ()' por 'now ()'. Isso também inclui o tempo.
Haentz
564

Em MySQL:

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

Em SQL Server:

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

Em Oracle:

SELECT  *
FROM    mytable
WHERE   record_date >= SYSDATE - 1

Em PostgreSQL:

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

Em Redshift:

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

Em SQLite:

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

Em MS Access:

SELECT  *
FROM    mytable
WHERE   record_date >= (Now - 1)
Quassnoi
fonte
3
Eu tento a consulta para o mysql, mas se for 02:00, por exemplo, eu recebo os registros de 00 - 02:00. Duas horas apenas em vez de 24. Alguma idéia?
Manos
Eu gosto muito da solução fornecida aqui, apenas o que observei no MySQL é que o desempenho da solução Guillaume Flandre foi mais rápido.
Oneworld
1
No Amazon Redshift, eu entendo function getdate() does not exist. Substituiu current_datee funcionou bem.
FloatingRock
1
Essa resposta me faz desejar que houvesse um botão "estrela", pois eu quero marcar isso como favorito.
Brian Risk
1
@Manos No MySQL, parece CURDATE()que não retorna uma data com uma parte de tempo, então ela vai para 00. Corrigi-o usando em NOW()vez de CURDATE().
4castle
21

MySQL:

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

O INTERVALO pode ser em ANO, MÊS, DIA, HORA, MINUTO, SEGUNDO

Por exemplo, nos últimos 10 minutos

SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(NOW(), INTERVAL 10 MINUTE)
Karthik Jayapal
fonte
3
Esta é a resposta que melhor responde à pergunta específica: Como retornar as 24 HORAS ANTERIORES (a partir do momento presente), em oposição às 24 anteriores (o que sugere todos os resultados para o dia anterior). Isso respondeu aos meus requisitos, isso me deixa com votos positivos. EDIT: Vale a pena mencionar a tabela nome_tabela.a_data deve ser um carimbo de data / hora.
Anthony Cregan
8

Qual SQL não foi especificado, SQL 2005/2008

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

Se você estiver nos tipos de datas de precisão aumentada de 2008, use a nova função sysdatetime (), igualmente, se usar o horário UTC, troque internamente as chamadas UTC.

Andrew
fonte
7

no postgres, assumindo que seu tipo de campo seja um carimbo de data / hora:

selecione * da tabela onde date_field> (now () - intervalo '24 hour ');

pisaruk
fonte
4

Se o registro de data e hora considerado for um registro de data e hora do UNIX, você precisa primeiro converter o registro de data e hora do UNIX (por exemplo, 1462567865) para registro de data e hora do mysql

SELECT * FROM `orders` WHERE FROM_UNIXTIME(order_ts) > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
acender
fonte
Isso assume que o mecanismo que está sendo usado é o MySQL, pois FROM_UNIXTIME () é uma função do MySQL. Para uso do SQL Server: SELECT DATEDIFF(s, '1970-01-01 00:00:00', DateField) se você precisar de precisão de milissegundos no SQL Server 2016 e posterior: SELECT DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', DateField)
luisdev
3
select ...
from ...
where YourDateColumn >= getdate()-1
Mladen Prajdic
fonte
2

Olá, agora que passou muito tempo desde o post original, mas tenho um problema semelhante e quero compartilhar.

Eu tenho um campo de data e hora com este formato AAAA-MM-DD hh: mm: ss e quero acessar um dia inteiro, então aqui está a minha solução.

A função DATE (), no MySQL: Extrai a parte da data de uma expressão de data ou data e hora.

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

com isso eu recebo todas as linhas registradas neste dia.

Espero que ajude alguém.

Rafa cosquiere
fonte
Este é o único que funcionou para mim no mySQL. Por alguma razão, quando tentei SELECT * FROM myTable WHERE myDate> DATE_SUB ('2018-06-13 00:00:00', INTERVAL 24 HORAS); Eu ainda estava recebendo discos de 2018-06-14.
JDub9
1
SELECT * 
FROM tableName 
WHERE datecolumn >= dateadd(hour,-24,getdate())
Galego
fonte
1

No SQL Server (nas últimas 24 horas):

SELECT  *
FROM    mytable
WHERE   order_date > DateAdd(DAY, -1, GETDATE()) and order_date<=GETDATE()
arunkumar.halder
fonte
2
por que você precisaria adicionar "e order_date <= GETDATE ()" quando você já está procurando as últimas 24 horas do momento da exeção dessa consulta? Realmente não faz sentido ter essa parte na cláusula where quando você já tiver mencionado "GETDATE" na primeira. É melhor que você faça "order_date> = DateAdd (DAY, -1, GETDATE ())" é isso!
KMX 16/05