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.

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)

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' )

+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.


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)

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.


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();

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)


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 - 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


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

-1
SELECT *  FROM table  
WHERE  YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.