Bagaimana cara memilih catatan dari 24 jam terakhir menggunakan SQL?

185

Saya mencari whereklausa yang dapat digunakan untuk mengambil catatan selama 24 jam terakhir?

Mike
sumber
1
Apakah Anda memiliki bidang cap waktu pada catatan ini?
Shawn Steward

Jawaban:

101
SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
Guillaume Flandre
sumber
6
Jika catatan disimpan sebagai DATETIME, ini akan memilih semua catatan dari tanggal sebelumnya, mengabaikan bagian waktu. Telah dijalankan pada 23:59:59, kueri akan mengembalikan semua catatan selama beberapa 48jam terakhir , bukan 24.
Quassnoi
18
Jika Anda ingin memilih 24 jam terakhir dari bidang datetime, gantikan 'curate ()' dengan 'now ()'. Ini juga termasuk waktu.
Haentz
564

Di MySQL:

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

Di SQL Server:

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

Di Oracle:

SELECT  *
FROM    mytable
WHERE   record_date >= SYSDATE - 1

Di PostgreSQL:

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

Di Redshift:

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

Di SQLite:

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

Di MS Access:

SELECT  *
FROM    mytable
WHERE   record_date >= (Now - 1)
Quassnoi
sumber
3
Saya mencoba permintaan untuk mysql tetapi jika 2AM nya, misalnya, saya mendapatkan catatan dari 00 - 02:00. Hanya dua jam, bukannya 24. Ada ide?
Manos
Saya sangat menyukai solusi yang disediakan di sini, apa yang saya catat di MySQL adalah kinerja solusi Guillaume Flandre lebih cepat.
oneworld
1
Di Amazon Redshift, saya mengerti function getdate() does not exist. Menggantinya dengan current_datedan itu berfungsi dengan baik.
FloatingRock
1
Jawaban ini membuat saya berharap ada tombol "bintang" karena saya ingin menandai ini.
Brian Risk
1
@Manos Di MySQL, sepertinya CURDATE()tidak mengembalikan tanggal dengan porsi waktu, begitu seterusnya 00. Saya memperbaikinya dengan menggunakan NOW()bukan CURDATE().
4castle
21

MySQL:

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

INTERVAL dapat dalam TAHUN, BULAN, HARI, JAM, MENIT, DETIK

Misalnya, dalam 10 menit terakhir

SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(NOW(), INTERVAL 10 MINUTE)
Karthik Jayapal
sumber
3
Ini adalah jawaban yang paling menjawab pertanyaan spesifik: Bagaimana mengembalikan 24 JAM PRECEDING (dari saat ini), sebagai lawan dari 24 sebelumnya (yang menyarankan semua hasil untuk hari sebelumnya). Ini menjawab persyaratan saya, ini membuat saya mendapatkan dukungan. EDIT: Nilainya menyebutkan kolom table_name.the_date harus stempel waktu.
Anthony Cregan
8

SQL mana yang tidak ditentukan, SQL 2005/2008

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

Jika Anda menggunakan tipe tanggal akurasi meningkat 2008, maka gunakan fungsi sysdatetime () baru, sama-sama jika menggunakan waktu UTC secara internal bertukar ke panggilan UTC.

Andrew
sumber
7

di postgres, dengan asumsi tipe bidang Anda adalah cap waktu:

pilih * dari tabel di mana date_field> (sekarang () - interval '24 jam ');

pisaruk
sumber
4

Jika cap waktu yang dianggap sebagai cap waktu UNIX, Anda harus terlebih dahulu mengonversi cap waktu UNIX (mis. 1462567865) menjadi stempel waktu mysql atau data

SELECT * FROM `orders` WHERE FROM_UNIXTIME(order_ts) > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
menyalakan
sumber
Itu dengan asumsi mesin yang digunakan adalah MySQL karena FROM_UNIXTIME () adalah fungsi MySQL. Untuk penggunaan SQL Server: SELECT DATEDIFF(s, '1970-01-01 00:00:00', DateField) Jika Anda membutuhkan akurasi milidetik di SQL Server 2016 dan yang lebih baru digunakan: SELECT DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', DateField)
luisdev
3
select ...
from ...
where YourDateColumn >= getdate()-1
Mladen Prajdic
sumber
2

Halo saya sekarang melewati banyak waktu dari posting asli tetapi saya punya masalah yang sama dan saya ingin berbagi.

Saya mendapat bidang datetime dengan format ini YYYY-MM-DD hh: mm: ss, dan saya ingin mengakses sepanjang hari, jadi inilah solusi saya.

Fungsi DATE (), di MySQL: Ekstrak bagian tanggal dari ekspresi tanggal atau datetime.

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

dengan ini saya mendapatkan semua daftar baris pada hari ini.

Saya harap ini membantu siapa pun.

Rafa cosquiere
sumber
Ini adalah satu-satunya yang bekerja untuk saya di mySQL. Untuk beberapa alasan ketika saya mencoba SELECT * FROM myTable WHERE myDate> DATE_SUB ('2018-06-13 00:00:00', INTERVAL 24 JAM); Saya masih mendapatkan catatan dari 2018-06-14.
jDub9
1
SELECT * 
FROM tableName 
WHERE datecolumn >= dateadd(hour,-24,getdate())
Orang belanda
sumber
1

Dalam SQL Server (Untuk 24 jam terakhir):

SELECT  *
FROM    mytable
WHERE   order_date > DateAdd(DAY, -1, GETDATE()) and order_date<=GETDATE()
arunkumar.halder
sumber
2
mengapa Anda perlu menambahkan "dan order_date <= GETDATE ()" ketika Anda sudah mencari 24 jam terakhir dari saat exection dari query itu? Sangat tidak masuk akal untuk memiliki bagian itu di mana klausa ketika Anda telah "MENDAPATKAN" sudah disebutkan di yang pertama. Anda lebih baik membuatnya "order_date> = DateAdd (DAY, -1, GETDATE ())" itu saja!
KMX