MySQL SELECT WHERE วันที่และเวลาตรงกับวัน (และไม่จำเป็นต้องเป็นเวลา)


127

ฉันมีตารางที่มีคอลัมน์วันที่และเวลา ฉันต้องการส่งคืนบันทึกทั้งหมดของวันที่กำหนดโดยไม่คำนึงถึงเวลา หรือกล่าวอีกนัยหนึ่งคือถ้าตารางของฉันมีเพียง 4 ระเบียนต่อไปนี้ระบบจะส่งคืนเฉพาะรายการที่ 2 และ 3 เท่านั้นหากฉัน จำกัด ไว้ที่ 2012-12-25

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00

ดูคำตอบของ John Woo ที่ stackoverflow.com/questions/14769026/…
ekerner

คำตอบ:


326

ไม่เคยใช้ตัวเลือกเช่นDATE(datecolumns) = '2012-12-24'- มันเป็นตัวฆ่าประสิทธิภาพ:

  • จะคำนวณDATE()สำหรับแถวทั้งหมดรวมทั้งแถวที่ไม่ตรงกัน
  • จะทำให้ไม่สามารถใช้ดัชนีสำหรับแบบสอบถามได้

ใช้งานได้เร็วกว่ามาก

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'

เนื่องจากจะอนุญาตให้ใช้ดัชนีโดยไม่ต้องคำนวณ

แก้ไข

ตามที่ระบุไว้โดย Used_By_Already ในช่วงเวลาตั้งแต่คำตอบเบื้องต้นในปี 2012 มี MySQL เวอร์ชันปรากฏขึ้นซึ่งการใช้ '23: 59: 59 'เป็นวันสิ้นวันนั้นไม่ปลอดภัยอีกต่อไป ควรอ่านเวอร์ชันที่อัปเดต

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'

ส่วนสำคัญของคำตอบคือการหลีกเลี่ยงตัวเลือกในนิพจน์ที่คำนวณได้แน่นอนว่ายังคงมีอยู่


ฉันกำลังจะแสดงความคิดเห็นว่าโซลูชันของ a1ex07 ดูเหมือนจะไม่ดีเท่าวิธีอื่น ๆ หลังจากอ่านโพสต์ของคุณบางทีฉันอาจต้องย้อนความคิดของฉัน!
user1032531

2
เพิ่งทดสอบบนเซิร์ฟเวอร์สองเครื่องข้างต้นนั้นเร็วกว่าวันที่ () = '' มาก (อย่างน้อย 10 เท่า) โดยเฉพาะอย่างยิ่งสำหรับตารางขนาดใหญ่ ขอบคุณ
zzapper

1
@KonradViltersten ฉันใช้วิธีที่ละเอียดมากในการสร้างข้อความค้นหาเพื่อให้อ่านง่ายขึ้นและผลักดันประเด็นของฉันกลับบ้าน aot ปรับแต่งมัน คำตอบโดย a1ex07 มีไวยากรณ์ที่เบาบาง
Eugen Rieck

9
@KonradViltersten - ยังดีกว่า: WHERE col >= '2012-12-25' AND col < '2012-12-25' + INTERVAL 1 DAY. มันหลีกเลี่ยง 0 เวลาและการทำงานสำหรับDATE, DATETIME, DATETIME(6)ฯลฯ และข้อเสนอที่มีการก้าวกระโดดวัน ฯลฯ
ริกเจมส์

1
'2012-12-25 23:59:59 น.' ไม่ถูกต้องเมื่อสิ้นสุดวันมันเป็นความคิดที่ไม่ดีเสมอไปและจะทำให้เกิดข้อบกพร่องสำหรับ MySQL เวอร์ชันที่รองรับความแม่นยำของเวลาย่อยวินาที ดีกว่ามากที่จะใช้แนวทางของ Rick James (ด้านบน) หรือ a1ex07 (คำตอบอื่น ๆ )
Used_By_Al แล้ว

35

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'อาจทำงานได้ดีขึ้น (ถ้าคุณมีดัชนีใน date_column) DATEมากกว่า


1
ฉันสงสัยจริงๆว่าอะไรเร็วกว่า - นี่หรือBETWEENวิธีแก้ปัญหา ... มีใครทำเครื่องหมาย?
jave.web

6
ไม่น่าจะแตกต่างอะไร เป็นเพียงวิธีการเขียนBETWEEN field >= value1 and fied<= value2
a1ex07

1
โปรดทราบว่าตามคู่มือ MySQL: "เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดเมื่อใช้ BETWEEN กับค่าวันที่หรือเวลาให้ใช้ CAST () เพื่อแปลงค่าเป็นชนิดข้อมูลที่ต้องการอย่างชัดเจนตัวอย่าง: หากคุณเปรียบเทียบ DATETIME เป็นค่า DATE สองค่าให้แปลง DATE ค่าเป็นค่า DATETIME หากคุณใช้ค่าคงที่ของสตริงเช่น "2001-1-1" ในการเปรียบเทียบกับ DATE ให้ส่งสตริงเป็น DATE " ดังนั้นเว้นแต่ว่าจะเป็นประเภทเดียวกันทั้งหมดควรแสดงอย่างชัดเจน
techdude

21

คุณสามารถใช้%:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'

13
LIKE น่าจะช้าถึง DATE (datetimecol) ใช้วิธีแก้ปัญหาของ Eugen หรือ a1ex07 ดีกว่า
Marie Fischer

3
ไม่ใช่เรื่องความเร็วเสมอไป ดังนั้นฉันจึงชอบวิธีแก้ปัญหานี้ อ่านง่ายกว่ามาก
Simon Hansen

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.