ฉันจะลบ 30 วันจากวันที่และเวลาปัจจุบันใน mysql ได้อย่างไร
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
ฉันจะลบ 30 วันจากวันที่และเวลาปัจจุบันใน mysql ได้อย่างไร
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
คำตอบ:
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
สำหรับผู้ที่ไม่ต้องการใช้DATE_SUB
ให้ใช้CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY
แต่ผลที่แตกต่างกันกว่าการใช้ ตั้งแต่คำถามที่ระบุว่า "ลบ 30 วันจากปัจจุบันที่datetime " มันอาจจะไม่ใช่สิ่งที่ OP ต้องการ
current_timestamp
แทนcurrent_date
อย่าใช้NOW()
เพราะคุณทำแคชแบบสอบถามหรือการเพิ่มประสิทธิภาพหายไปเนื่องจากแบบสอบถามแตกต่างกันทุกครั้ง ดูรายชื่อฟังก์ชั่นที่คุณไม่ควรใช้ในเอกสาร MySQL
ในรหัสด้านล่างสมมติว่าตารางนี้เติบโตตามกาลเวลา มีการเพิ่มรายการใหม่และคุณต้องการแสดงเฉพาะรายการในช่วง 30 วันที่ผ่านมา นี่เป็นกรณีที่พบบ่อยที่สุด
โปรดทราบว่าวันที่ได้รับการเพิ่มเป็นสตริง เป็นการดีกว่าถ้าคุณเพิ่มวันที่ด้วยวิธีนี้จากรหัสการโทรของคุณแทนที่จะใช้NOW()
ฟังก์ชั่นในขณะที่มันฆ่าแคชของคุณ
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
คุณสามารถใช้งานได้BETWEEN
หากคุณต้องการเพียงแค่สิ่งของจากสองถึง 30 วันก่อนหน้านี้ แต่มันไม่ใช่กรณีการใช้งานทั่วไปในประสบการณ์ของฉันดังนั้นฉันหวังว่าแบบสอบถามแบบง่ายจะให้บริการคุณได้ดี
NOW()
และยังคงใช้ในคำตอบของคุณ o_O PS: ข้อความค้นหาของคุณจะให้ผลลัพธ์อื่นไม่ใช่สิ่งที่ OP ต้องการ
BETWEEN
และ>=
เป็นผู้ให้บริการที่แตกต่างกันคุณรู้หรือไม่? My แบบสอบถาม จำกัด ผลการตั้งค่าสำหรับการนี้30 days ago AND today
everything after 30 days ago
ดังนั้นtomorrow
บันทึกจะไม่ตรงกับของฉันและข้อความค้นหาดั้งเดิมของคุณ แต่จะจับคู่กับคำตอบนี้
MySQL ลบวันนับจากนี้:
select now(), now() - interval 1 day
พิมพ์:
2014-10-08 09:00:56 2014-10-07 09:00:56
อาร์กิวเมนต์หน่วยนิพจน์ช่วงเวลาอื่น ๆ :
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
คุณยังสามารถใช้
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
คุณสามารถจัดรูปแบบโดยใช้รูปแบบวันที่ใน SQL
อีกวิธีหนึ่ง
SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
หากคุณต้องการเพียงวันที่และไม่ใช่เวลาที่ใช้:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
เนื่องจากcurdate()
ไม่ได้ระบุองค์ประกอบเวลาจึงอาจเร็วกว่าnow()
"แก้ไขความหมาย" ในกรณีที่คุณสนใจเฉพาะวันที่เท่านั้น
นอกจากนี้subdate()
's เกิน 2 arity interval
อาจเร็วกว่าการใช้
interval
มีไว้สำหรับกรณีที่คุณต้องการส่วนประกอบที่ไม่ใช่วัน
subdate(curdate(), 30)
เป็นสิ่งที่เลวร้ายยิ่งกว่าCURRENT_DATE - INTERVAL 30 DAY
? คุณมีหลักฐานหรือไม่ และจะเร็วแค่ไหน? ไม่กี่ไมโครวินาที?
subdate
ว่าการเป็นไปได้เร็วกว่านั้นอาจอธิบายได้ในความคิดของคุณโดย "2-arity overload" แต่โปรดยกโทษให้ฉันว่านี่เป็นคำถามที่โง่คำเหล่านั้นหมายถึงอะไร (เกี่ยวกับฟังก์ชั่น )? โดยเฉพาะ "2-arity" คืออะไร
curdate()
จริงอาจเป็นทางเลือกที่ผิดเพราะ OP ดูเหมือนจะต้องการที่จะ "ลบ 30 วันจากปัจจุบันที่datetime " (ผมขอย้ำ)