Kueri untuk mendapatkan semua baris dari bulan sebelumnya

90

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_createdkolom dalam database saya yang daftar tanggal dibuat dalam format ini: 2007-06-05 14:50:17.

lewisqic
sumber

Jawaban:

198
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
hobodave
sumber
70
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
Ghazanfar Mir
12
@GhazanfarMir kueri Anda tidak cukup cocok dengan pertanyaannya, sedangkan jawaban di atas, cocok. Anda mengembalikan baris antara hari ini bulan lalu sampai kemarin.
Matt Passell
@MattPassell Saya minta maaf tapi betweensudah termasuk batasan .. Ini akan menyertakan tanggal sekarang juga. Mengapa / Bagaimana ini akan dibatasi hingga kemarin ?? Tolong jelaskan?
Ghazanfar Mir
4
Saya mengerti maksud Anda .. Ya, Anda benar .. pertanyaan saya bukanlah yang diinginkan OP .. Saya salah paham dengan pertanyaannya
Ghazanfar Mir
bagaimana jika current_datebukan hari ini tetapi tanggal acak yang diberikan dari klien?
dios231
22

Berikut alternatif lain. Dengan asumsi Anda memiliki bidang yang diindeks DATEatau DATETIMEjenis, ini harus menggunakan indeks karena tanggal yang diformat akan diubah jenisnya sebelum indeks digunakan. Anda kemudian akan melihat rangekueri daripada indexkueri 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' )
martin clayton
sumber
+1. Jauh lebih ramah indeks. Anda juga bisa melempar STR_TO_DATEsekitar DATE_FORMATsehingga selalu berurusan dengan objek tanggal.
Leigh
14

Jika tidak ada tanggal masa depan ...

SELECT * 
FROM   table_name 
WHERE  date_created > (NOW() - INTERVAL 1 MONTH);

Diuji.

ekerner
sumber
3
Saya pikir mereka sedang mencari sesuatu yang berbeda. yaitu Semua catatan dari bulan lalu (yaitu 1 Okt - 31 Okt 2012 23:59:59). Kueri di atas akan mengembalikan ~ 30 hari terakhir atau lebih, dari tanggal dan waktu hari ini .
Leigh
13

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)
SMTF
sumber
Ini bekerja dengan baik selama berbulan-bulan, tetapi sayangnya tidak ada YEAR_WEEK interval temporal , jadi Anda harus kembali ke jawaban hobodave jika Anda membutuhkan minggu, bukan bulan.
Danny Beckett
8
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.

Gregg
sumber
Saya lupa menyebutkan ... ini harus mengembalikan semua catatan dari bulan kalender sebelumnya, dibandingkan dengan catatan untuk 30 atau 31 hari terakhir.
Gregg
Menurut pendapat saya, ini harus menjadi jawaban yang diterima karena lebih sederhana daripada jawaban yang diterima namun memberikan hasil yang sama
Grant
3

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();
Ghazanfar Mir
sumber
2
Tidak, kurang tepat. Lihat tanggapan saya atas komentar Anda atas jawaban yang diberikan oleh @hobodave
Matt
@MattPassell Anda benar, saya salah paham dengan pertanyaan itu .. Saya melewatkan poin bahwa hasil seharusnya hanya terbatas pada catatan HANYA dari bulan lalu.
Ghazanfar Mir
2
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
  AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY) 

Ini berfungsi untuk saya (Memilih semua rekaman yang dibuat dari bulan lalu, terlepas dari hari Anda menjalankan kueri bulan ini)

Giles
sumber
1

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.

ggiroux.dll
sumber
@ggiroux - Itu harus mengubah tanggal menjadi tipe karakter sebelum menerapkan LIKE.
martin clayton
ya memang, tetapi masih ada peningkatan atas jawaban yang dipilih IMHO (IFF date_created diindeks)
ggiroux
1

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

saqib jahangir Pakistan
sumber
Sudahkah Anda mencoba menjalankan kueri itu? Sejauh yang saya lihat, itu tidak akan memilih semua tanggal dari bulan-bulan sebelumnya (seperti: mengembalikan data dari Januari sepanjang seluruh Februari), tetapi mengembalikan data dari rentang yang dimulai pada hari yang sama satu bulan lalu
Nico Haase
0

Alternatif dengan kondisi tunggal

SELECT * FROM table
WHERE YEAR(date_created) * 12 + MONTH(date_created)
    = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
kcsoft
sumber
-1
SELECT *  FROM table  
WHERE  YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
sid busa
sumber
Sudahkah Anda mencoba menjalankan kueri itu? Sejauh yang saya lihat, itu tidak akan memilih semua tanggal dari bulan-bulan sebelumnya (seperti: mengembalikan data dari Januari sepanjang seluruh Februari), tetapi mengembalikan data dari rentang yang dimulai pada hari yang sama satu bulan lalu
Nico Haase
saya telah membuat sedikit perubahan, periksa sekarang sudah berfungsi atau tidak
sid busa