วิธีการลบ 30 วันจากช่วงเวลาปัจจุบันใน mysql


197

ฉันจะลบ 30 วันจากวันที่และเวลาปัจจุบันใน mysql ได้อย่างไร

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

คำตอบ:



128

สำหรับผู้ที่ไม่ต้องการใช้DATE_SUBให้ใช้CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY

2
ฉันจะให้ +10 นี้ถ้าทำได้ SQL ควรเกี่ยวกับความสามารถในการอ่านและนี่เป็นวิธีที่ง่ายที่สุดในการอ่าน
โคลิน 't ฮาร์ต

9
อ่านได้มากขึ้น NOW() - INTERVAL 30 DAYแต่ผลที่แตกต่างกันกว่าการใช้ ตั้งแต่คำถามที่ระบุว่า "ลบ 30 วันจากปัจจุบันที่datetime " มันอาจจะไม่ใช่สิ่งที่ OP ต้องการ
ypercubeᵀᴹ

2
@ ypercubeᵀᴹจากนั้นใช้current_timestampแทนcurrent_date
isapir

21

อย่าใช้NOW()เพราะคุณทำแคชแบบสอบถามหรือการเพิ่มประสิทธิภาพหายไปเนื่องจากแบบสอบถามแตกต่างกันทุกครั้ง ดูรายชื่อฟังก์ชั่นที่คุณไม่ควรใช้ในเอกสาร MySQL

ในรหัสด้านล่างสมมติว่าตารางนี้เติบโตตามกาลเวลา มีการเพิ่มรายการใหม่และคุณต้องการแสดงเฉพาะรายการในช่วง 30 วันที่ผ่านมา นี่เป็นกรณีที่พบบ่อยที่สุด

โปรดทราบว่าวันที่ได้รับการเพิ่มเป็นสตริง เป็นการดีกว่าถ้าคุณเพิ่มวันที่ด้วยวิธีนี้จากรหัสการโทรของคุณแทนที่จะใช้NOW()ฟังก์ชั่นในขณะที่มันฆ่าแคชของคุณ

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

คุณสามารถใช้งานได้BETWEENหากคุณต้องการเพียงแค่สิ่งของจากสองถึง 30 วันก่อนหน้านี้ แต่มันไม่ใช่กรณีการใช้งานทั่วไปในประสบการณ์ของฉันดังนั้นฉันหวังว่าแบบสอบถามแบบง่ายจะให้บริการคุณได้ดี


3
ดังนั้นคุณจึงเสนอไม่ได้ใช้NOW()และยังคงใช้ในคำตอบของคุณ o_O PS: ข้อความค้นหาของคุณจะให้ผลลัพธ์อื่นไม่ใช่สิ่งที่ OP ต้องการ
zerkms

@zerkms แบบสอบถามนี้จะสร้างชุดผลลัพธ์ที่แตกต่างจากแบบสอบถามของคุณอย่างไร
user784637

2
@ user784637: เอ่อBETWEENและ>=เป็นผู้ให้บริการที่แตกต่างกันคุณรู้หรือไม่? My แบบสอบถาม จำกัด ผลการตั้งค่าสำหรับการนี้30 days ago AND today everything after 30 days agoดังนั้นtomorrowบันทึกจะไม่ตรงกับของฉันและข้อความค้นหาดั้งเดิมของคุณ แต่จะจับคู่กับคำตอบนี้
zerkms

ตกลงฉันไม่ดี โดยทั่วไปแบบสอบถามดังกล่าวอยู่ในตารางสดที่เติบโตตามกาลเวลา นั่นคือเหตุผลที่ฉันทิ้งระหว่าง ฉันได้ชี้แจงคำตอบของฉันไว้ด้านบน
Joseph Lust

@JosephLust หากต้องการแก้ไขปัญหาด้านประสิทธิภาพให้ใช้โซลูชันของฉันแทน
Pacerier

17

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 


1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

คุณสามารถจัดรูปแบบโดยใช้รูปแบบวันที่ใน SQL



0

หากคุณต้องการเพียงวันที่และไม่ใช่เวลาที่ใช้:

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

เนื่องจากcurdate()ไม่ได้ระบุองค์ประกอบเวลาจึงอาจเร็วกว่าnow()"แก้ไขความหมาย" ในกรณีที่คุณสนใจเฉพาะวันที่เท่านั้น

นอกจากนี้subdate()'s เกิน 2 arity intervalอาจเร็วกว่าการใช้ intervalมีไว้สำหรับกรณีที่คุณต้องการส่วนประกอบที่ไม่ใช่วัน


11
ดังนั้นคุณอ้างว่านั่นsubdate(curdate(), 30)เป็นสิ่งที่เลวร้ายยิ่งกว่าCURRENT_DATE - INTERVAL 30 DAY? คุณมีหลักฐานหรือไม่ และจะเร็วแค่ไหน? ไม่กี่ไมโครวินาที?
ypercubeᵀᴹ

2
ฉันไม่รู้. แน่นอนว่าฉันไม่สามารถโหวตความคิดเห็นของตัวเองได้ เกี่ยวกับการอ้างสิทธิ์ที่เร็วขึ้น "ที่อาจเกิดขึ้น" ฉันยังไม่เห็นข้อพิสูจน์ชี้ขาดหรือสถานการณ์แวดล้อม และแม้ว่ามันจะค่อนข้างเร็วกว่าเงื่อนไขก็จะถูกประเมินอีกครั้ง ยกเว้นว่าคุณเรียกใช้คิวรีล้านครั้งต่อนาทีความแตกต่างจะไม่สำคัญ
ypercubeᵀᴹ

2
ฉันเดาsubdateว่าการเป็นไปได้เร็วกว่านั้นอาจอธิบายได้ในความคิดของคุณโดย "2-arity overload" แต่โปรดยกโทษให้ฉันว่านี่เป็นคำถามที่โง่คำเหล่านั้นหมายถึงอะไร (เกี่ยวกับฟังก์ชั่น )? โดยเฉพาะ "2-arity" คืออะไร
Andriy M

1
นอกจากนี้เท่าที่เป็นถ้อยคำของคำถามที่curdate()จริงอาจเป็นทางเลือกที่ผิดเพราะ OP ดูเหมือนจะต้องการที่จะ "ลบ 30 วันจากปัจจุบันที่datetime " (ผมขอย้ำ)
Andriy M

1
@AndriyM เนื่องจากหัวข้อนี้ได้รับการดู 50k ฉันจะออกจากคำตอบที่นี่สำหรับผู้ที่สนใจเฉพาะองค์ประกอบเวลา และเรื่อง "arity" ก็หมายถึงจำนวนของการขัดแย้ง ใช่ถูกต้องสำหรับทุกสิ่งเท่ากันฟังก์ชั่น 2-arity อาจเร็วกว่าแบบ 3-arity นั่นจะถือเป็นจริงจนกว่าจะมีการเพิ่มข้อมูลใหม่ลงในจาน
Pacerier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.