Jak wybrać rekordy z ostatnich 24 godzin za pomocą SQL?


185

Szukam whereklauzuli, której można użyć do odzyskania rekordów z ostatnich 24 godzin?


1
Czy masz pole datownika na tych rekordach?
Shawn Steward,

Odpowiedzi:


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

6
Jeśli rekordy są przechowywane jako DATETIME, spowoduje to wybranie wszystkich rekordów z poprzedniej daty, niezależnie od części czasu. Uruchomione o 23:59:59, zapytanie zwróci wszystkie rekordy z ostatnich 48godzin, a nie 24.
Quassnoi,

18
Jeśli chcesz wybrać ostatnie 24 godziny z pola daty i godziny, zamień „curate ()” na „now ()”. Obejmuje to także czas.
Haentz

564

W MySQL:

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

W SQL Server:

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

W Oracle:

SELECT  *
FROM    mytable
WHERE   record_date >= SYSDATE - 1

W PostgreSQL:

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

W Redshift:

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

W SQLite:

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

W MS Access:

SELECT  *
FROM    mytable
WHERE   record_date >= (Now - 1)

3
Próbuję kwerendy dla mysql, ale jeśli na przykład jego 2AM, otrzymuję rekordy od 00 do 02 rano. Tylko dwie godziny zamiast 24. Jakieś pomysły?
Manos

Bardzo podoba mi się przedstawione tutaj rozwiązanie, właśnie zauważyłem w MySQL, że wydajność rozwiązania Guillaume Flandre była szybsza.
oneworld

1
W Amazon Redshift rozumiem function getdate() does not exist. Zastąpiłem go current_datei działało dobrze.
FloatingRock,

1
Ta odpowiedź sprawia, że ​​żałuję, że nie ma przycisku „gwiazda”, ponieważ chcę to dodać do zakładek.
Brian Risk

1
@Manos W MySQL wygląda na to, że CURDATE()nie zwraca daty z określoną częścią czasu, więc idzie do 00. Naprawiłem to za pomocą NOW()zamiast CURDATE().
4castle

21

MySQL:

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

INTERWAŁ może być w ROKU, MIESIĄCU, DNIU, GODZINIE, MINUTIE, SEKUNDIE

Na przykład w ciągu ostatnich 10 minut

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

3
Oto odpowiedź, która najlepiej odpowiada na konkretne pytanie: Jak zwrócić WCZEŚNIEJSZE 24 GODZINY (od chwili obecnej), w przeciwieństwie do poprzednich 24 (co sugeruje wszystkie wyniki z poprzedniego dnia). To spełniło moje wymagania, zyskało moje poparcie. EDYCJA: Warto wspomnieć o nazwie nazwa_tabeli. Kolumna_data powinna być znacznikiem czasu.
Anthony Cregan

8

Który SQL nie został określony, SQL 2005/2008

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

Jeśli używasz typów dat o podwyższonej dokładności w 2008 r., Zamiast tego użyj nowej funkcji sysdatetime (), podobnie jeśli używasz czasów UTC wewnętrznie zamieniających się na wywołania UTC.


7

w postgres, zakładając, że typ pola jest znacznikiem czasu:

wybierz * z tabeli, w której pole data> (teraz () - interwał „24 godziny”);


4

Jeśli rozważany znacznik czasu jest znacznikiem czasu UNIX, należy najpierw przekonwertować znacznik czasu UNIX (np. 1462567865) na znacznik czasu mysql lub dane

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

Zakłada się, że używany silnik to MySQL, ponieważ FROM_UNIXTIME () jest funkcją MySQL. Do użytku z programem SQL Server: SELECT DATEDIFF(s, '1970-01-01 00:00:00', DateField) Jeśli potrzebujesz dokładności do milisekund w programie SQL Server 2016 i nowszych, użyj: SELECT DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', DateField)
luisdev


2

Witaj, minęło już dużo czasu od oryginalnego postu, ale mam podobny problem i chcę się podzielić.

Mam pole daty i godziny w tym formacie RRRR-MM-DD gg: mm: ss i chcę uzyskać dostęp przez cały dzień, więc oto moje rozwiązanie.

Funkcja DATE () w MySQL: Wyodrębnij część daty wyrażenia date lub datetime.

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

dzięki temu otrzymuję cały rejestr wierszy w tym dniu.

Mam nadzieję, że każdemu pomoże.


To jedyny, który działał dla mnie na mySQL. Z jakiegoś powodu, kiedy próbowałem WYBIERZ * z myTable GDZIE myDate> DATE_SUB ('2018-06-13 00:00:00', INTERVAL 24 HOUR); Wciąż otrzymywałem rekordy od 14.06.2018.
jDub9


1

W SQL Server (z ostatnich 24 godzin):

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

2
dlaczego miałbyś dodawać „i order_date <= GETDATE ()”, gdy już szukasz ostatnich 24 godzin od momentu wykrycia tego zapytania? Naprawdę nie ma sensu mieć tej części w klauzuli where, gdy masz już napis „GETDATE” w pierwszym. Lepiej, żeby to było „order_date> = DateAdd (DAY, -1, GETDATE ())” to wszystko!
KMX
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.