Saya perlu memilih semua baris dalam database saya yang dibuat bulan lalu.
Misalnya, jika bulan saat ini adalah Januari, maka saya ingin mengembalikan semua baris yang dibuat pada bulan Desember, jika bulannya adalah Februari, maka saya ingin mengembalikan semua baris yang dibuat pada bulan Januari. Saya memiliki date_created
kolom dalam database saya yang daftar tanggal dibuat dalam format ini: 2007-06-05 14:50:17
.
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
between
sudah termasuk batasan .. Ini akan menyertakan tanggal sekarang juga. Mengapa / Bagaimana ini akan dibatasi hingga kemarin ?? Tolong jelaskan?current_date
bukan hari ini tetapi tanggal acak yang diberikan dari klien?Berikut alternatif lain. Dengan asumsi Anda memiliki bidang yang diindeks
DATE
atauDATETIME
jenis, ini harus menggunakan indeks karena tanggal yang diformat akan diubah jenisnya sebelum indeks digunakan. Anda kemudian akan melihatrange
kueri daripadaindex
kueri saat dilihat dengan JELASKAN .SELECT * FROM table WHERE date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) AND date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )
sumber
STR_TO_DATE
sekitarDATE_FORMAT
sehingga selalu berurusan dengan objek tanggal.Jika tidak ada tanggal masa depan ...
SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Diuji.
sumber
Alternatif untuk jawaban hobodave
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Anda dapat mencapai hal yang sama dengan EXTRACT, menggunakan YEAR_MONTH sebagai unit, sehingga Anda tidak memerlukan AND, seperti:
SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH)
sumber
YEAR_WEEK
interval temporal , jadi Anda harus kembali ke jawaban hobodave jika Anda membutuhkan minggu, bukan bulan.SELECT * FROM yourtable where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
Ini harus mengembalikan semua catatan dari bulan kalender sebelumnya, sebagai lawan dari catatan selama 30 atau 31 hari terakhir.
sumber
Meskipun jawaban untuk pertanyaan ini telah dipilih, namun saya yakin pertanyaan yang paling sederhana adalah
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
sumber
Ini berfungsi untuk saya (Memilih semua rekaman yang dibuat dari bulan lalu, terlepas dari hari Anda menjalankan kueri bulan ini)
sumber
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
yang satu ini akan dapat memanfaatkan indeks jika date_created Anda diindeks, karena tidak menerapkan fungsi transformasi apa pun ke nilai bidang.
sumber
Berikut adalah query untuk mendapatkan record bulan lalu:
SELECT * FROM `tablename` WHERE `datefiled` BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) AND LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) )
Salam - saqib
sumber
Alternatif dengan kondisi tunggal
SELECT * FROM table WHERE YEAR(date_created) * 12 + MONTH(date_created) = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
sumber
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
sumber