Jika Anda memilih berdasarkan tanggal saja, dasarkan perhitungan Anda pada CURDATE
(yang hanya mengembalikan tanggal) daripada NOW
(yang mengembalikan tanggal dan waktu). Contoh berikut akan menangkap semua waktu dalam rentang hari:
- Hari ini:
WHERE timestamp >= CURDATE()
- Kemarin:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Bulan ini:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Antara dua tanggal 3 Juni 2013 dan 7 Juni 2013 (perhatikan bagaimana tanggal akhir ditetapkan sebagai 8 Juni, bukan 7 Juni):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
"Minggu ini" tergantung pada hari mana Anda memulai minggu; Aku akan menyerahkan itu padamu. Anda dapat menggunakan DAYOFWEEK
berfungsi untuk mengubah CURDATE()
ke rentang yang tepat.
Tambahan :Jenis kolom OP adalah INTEGER
, menyimpan stempel waktu UNIX, dan jawaban saya mengasumsikan jenis kolomnya adalah TIMESTAMP
. Inilah cara melakukan semua hal yang sama dengan nilai stempel waktu UNIX dan tetap mempertahankan pengoptimalan jika kolom diindeks (seperti jawaban di atas akan dilakukan jika TIMESTAMP
kolom diindeks)...
Pada dasarnya, solusinya adalah dengan membungkus tanggal awal dan/atau akhir di UNIX_TIMESTAMP
fungsi:
- Hari ini:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Kemarin:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Bulan ini:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Antara dua tanggal 3 Juni 2013 dan 7 Juni 2013 (perhatikan bagaimana tanggal akhir ditetapkan sebagai 8 Juni, bukan 7 Juni):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')