Bagaimana cara mengurangi 30 hari dari datetime saat ini di mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Bagaimana cara mengurangi 30 hari dari datetime saat ini di mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Jawaban:
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
Untuk siapa saja yang tidak ingin menggunakan DATE_SUB
, gunakan CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY
. Karena pertanyaan itu menyebutkan "kurangi 30 hari dari datetime saat ini ", itu mungkin bukan yang diinginkan OP.
current_timestamp
sebagai ganticurrent_date
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 BETWEEN
jika 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.
NOW()
dan tetap menggunakannya dalam jawaban Anda. o_O PS: kueri Anda akan mengembalikan hasil lain , bukan apa yang OP inginkan
BETWEEN
dan >=
apakah operator berbeda, Anda tahu? Kueri saya membatasi hasil yang ditetapkan untuk 30 days ago AND today
ini everything after 30 days ago
. Jadi, tomorrow
catatan tidak akan cocok dengan milik saya dan permintaan awal Anda, tetapi akan cocok dengan jawaban ini
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
Anda juga bisa menggunakan
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Anda dapat memformat dengan menggunakan format tanggal dalam SQL.
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
.
interval
dimaksudkan untuk kasus ketika Anda membutuhkan komponen non-hari.
subdate(curdate(), 30)
lebih dari faaster CURRENT_DATE - INTERVAL 30 DAY
? Apakah Anda punya bukti? Dan seberapa cepat itu? Beberapa mikrodetik?
subdate
mungkin 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"?
curdate()
mungkin sebenarnya merupakan pilihan yang salah, karena OP tampaknya ingin "mengurangi 30 hari dari datetime saat ini " (penekanan tambang).