Bagaimana cara mengurangi 30 hari dari datetime saat ini di mysql?

194

Bagaimana cara mengurangi 30 hari dari datetime saat ini di mysql?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
pengguna784637
sumber

Jawaban:

127

Untuk siapa saja yang tidak ingin menggunakan DATE_SUB, gunakan CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY
Doug Fir
sumber
2
Saya akan memberikan 10 ini jika saya bisa. SQL harus tentang keterbacaan dan ini adalah cara yang paling mudah dibaca untuk melakukan ini.
Colin 't Hart
9
Lebih mudah dibaca tetapi hasilnya berbeda daripada menggunakan NOW() - INTERVAL 30 DAY. Karena pertanyaan itu menyebutkan "kurangi 30 hari dari datetime saat ini ", itu mungkin bukan yang diinginkan OP.
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ lalu gunakan current_timestampsebagai ganticurrent_date
isapir
21

Jangan gunakan NOW()karena Anda kehilangan cache kueri atau optimisasi karena kueri itu berbeda setiap saat. Lihat daftar fungsi yang tidak boleh Anda gunakan dalam dokumentasi MySQL .

Dalam kode di bawah ini, mari kita asumsikan tabel ini berkembang seiring waktu. Barang baru ditambahkan dan Anda ingin menunjukkan barang-barang itu dalam 30 hari terakhir. Ini adalah kasus yang paling umum.

Perhatikan bahwa tanggal telah ditambahkan sebagai string. Lebih baik menambahkan tanggal dengan cara ini, dari kode panggilan Anda, daripada menggunakan NOW()fungsi karena membunuh caching Anda.

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

Anda dapat menggunakan BETWEENjika Anda benar-benar hanya menginginkan barang-barang mulai dari detik ini hingga 30 hari sebelum detik ini, tapi itu bukan kasus penggunaan umum dalam pengalaman saya, jadi saya berharap permintaan yang disederhanakan dapat melayani Anda dengan baik.

Joseph Lust
sumber
3
Jadi Anda mengusulkan untuk tidak menggunakan NOW()dan tetap menggunakannya dalam jawaban Anda. o_O PS: kueri Anda akan mengembalikan hasil lain , bukan apa yang OP inginkan
zerkms
@zerkms Bagaimana kueri ini menghasilkan set hasil yang berbeda dari kueri Anda?
user784637
2
@ user784637: uhm, BETWEENdan >=apakah operator berbeda, Anda tahu? Kueri saya membatasi hasil yang ditetapkan untuk 30 days ago AND todayini everything after 30 days ago. Jadi, tomorrowcatatan tidak akan cocok dengan milik saya dan permintaan awal Anda, tetapi akan cocok dengan jawaban ini
zerkms
Ok, salahku. Biasanya pertanyaan seperti itu ada di tabel langsung yang tumbuh seiring waktu. Itu sebabnya saya menjatuhkan keduanya. Saya sudah mengklarifikasi jawaban saya di atas.
Joseph Lust
@ JosephLust, Untuk mengatasi masalah kinerja, gunakan solusi saya sebagai gantinya.
Pacerier
17

MySQL kurangi hari dari sekarang:

select now(), now() - interval 1 day

Cetakan:

2014-10-08 09:00:56     2014-10-07 09:00:56

Argumen Interval Temporal Expression Unit lainnya:

https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 
Eric Leschinski
sumber
16

Anda juga bisa menggunakan

select CURDATE()-INTERVAL 30 DAY
Noby Nirmal
sumber
1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

Anda dapat memformat dengan menggunakan format tanggal dalam SQL.

Varaj Vignesh
sumber
0

cara lain

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
zzapper
sumber
0

Jika Anda hanya perlu tanggal dan bukan waktu gunakan:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

Karena curdate()menghilangkan komponen waktu, maka berpotensi lebih cepat daripadanow() dan lebih "benar secara semantik" dalam kasus di mana Anda hanya tertarik pada tanggal.

Juga, subdate()kelebihan 2-arity berpotensi lebih cepat daripada menggunakan interval. intervaldimaksudkan untuk kasus ketika Anda membutuhkan komponen non-hari.

Pacerier
sumber
11
Jadi, Anda mengklaim itu subdate(curdate(), 30)lebih dari faaster CURRENT_DATE - INTERVAL 30 DAY? Apakah Anda punya bukti? Dan seberapa cepat itu? Beberapa mikrodetik?
ypercubeᵀᴹ
2
Saya tidak punya ide. Saya tentu saja tidak dapat memperbaiki komentar saya sendiri. Tentang klaim "yang berpotensi" lebih cepat, saya masih tidak melihat bukti, tegas, atau mendalam. Dan bahkan jika itu agak lebih cepat, kondisinya akan dievaluasi sekali. Kecuali jika Anda menjalankan kueri jutaan kali per menit, perbedaannya tidak menjadi masalah.
ypercubeᵀᴹ
2
Saya menduga subdatemungkin lebih cepat entah bagaimana mungkin dijelaskan, menurut pendapat Anda, dengan "2-arity overload", tapi, tolong maafkan saya jika ini adalah pertanyaan bodoh, apa arti kata-kata itu (berkenaan dengan fungsi )? Khususnya, apa itu "2-arity"?
Andriy M
1
Juga, sejauh kata-kata dari pertanyaan itu, curdate()mungkin sebenarnya merupakan pilihan yang salah, karena OP tampaknya ingin "mengurangi 30 hari dari datetime saat ini " (penekanan tambang).
Andriy M
1
@AndriyM, Yah karena utas ini mendapatkan 50k tampilan, saya akan meninggalkan jawabannya di sini untuk orang-orang yang hanya tertarik pada komponen waktu. Dan mengenai "arity", itu merujuk pada sejumlah argumen . Ya itu benar, untuk semua hal yang sama, fungsi 2-arity berpotensi lebih cepat daripada yang 3-arity. Itu akan berlaku sampai informasi baru ditambahkan ke piring.
Pacerier