Kueri MySQL - Catatan antara Hari Ini dan 30 Hari Terakhir

122

Saya ingin mengembalikan semua catatan yang ditambahkan ke database dalam 30 hari terakhir. Saya perlu mengubah tanggal menjadi bb / hh / tt karena tujuan tampilan.

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

Pernyataan saya gagal membatasi catatan hingga 30 hari terakhir - ini memilih semua catatan.

Adakah yang bisa mengarahkan saya ke arah yang benar? Rasanya aku sudah dekat.

Terima kasih dan semoga minggu Anda menyenangkan.

Jason Sweet
sumber

Jawaban:

292

Anda perlu menerapkan DATE_FORMATdi SELECTklausa, bukan WHEREklausa:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

Perhatikan juga bahwa CURDATE()mengembalikan hanya DATEsebagian dari tanggal, jadi jika Anda menyimpan create_datesebagai DATETIMEdengan bagian waktu terisi, kueri ini tidak akan memilih rekaman hari ini.

Dalam kasus ini, Anda harus menggunakan NOW:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
Quassnoi
sumber
Bagian kedua dari jawaban ini sangat penting! Saya mungkin atau mungkin tidak memiliki masalah itu dan saya menggaruk-garuk kepala sampai saya kembali ke jawaban ini.
Tyler Lazenby
@Quassno Maafkan aku. Tampaknya ini hanya masalah persiapan \ wpdb WordPress. Maaf lagi.
vee
56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Thinkcast
sumber
2
Saya lebih suka metode ini dari BETWEEN CURDATE () - INTERVAL 30
Dan
1
@ErmSo, saya bisa tahu kenapa?
ramping
3
Saya tidak akan berbohong - itu 2 tahun yang lalu dan saya tidak ingat! Maaf: P
Dan
1
Tidak perlu menggunakanDATE_FORMAT(create_date, '%m/%d/%Y')
kazy
@Dan saya lebih suka membuatnya lebih mudah dibaca dengan melampirkan tanggal sebelumnya dalam tanda kurung: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig
10

DATE_FORMATmengembalikan sebuah string, jadi Anda menggunakan dua string dalam BETWEENklausa Anda , yang tidak akan berfungsi seperti yang Anda harapkan.

Sebaliknya, ubah tanggal ke format Anda di SELECTdan lakukan BETWEENuntuk tanggal sebenarnya. Sebagai contoh,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
Rich Adams
sumber
9

Anda juga dapat menulis ini di mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

TETAP

Rohit Suthar
sumber
2
Hati-hati: meskipun up-orang, ini memilih tanggal di depan 30 hari / bulan, bukan terakhir 30 hari!
JonBrave
4
Setuju, harus WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MONTH);
Bhavik P.
6

Untuk aktivitas tanggal saat ini dan aktivitas lengkap untuk 30 hari sebelumnya gunakan ini, karena SYSDATE adalah variabel di hari sebelumnya 30 hari tidak akan memiliki seluruh data untuk hari itu.

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
hanya dengan pengalaman saya
sumber
1

Berikut solusi tanpa menggunakan curdate()fungsi, ini adalah solusi bagi yang menggunakan TSQLsaya kira

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
mvirant
sumber