MySQL เลือกวันที่เท่ากับวันนี้


100

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

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

ฉันได้แก้ไขSELECTข้อความของฉันแล้วขอบคุณพวกเขา

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()


ดูเหมือนว่าsignup_dateจะเป็นฟิลด์วันที่และเวลา
Sergii Stotskyi

@Serjio ใช่ปัจจุบันเป็นฟิลด์วันที่และเวลา
Jako

ประเภทข้อมูลคืออะไรsignup_dateถ้ามีเวลาคุณจะต้องใช้ date_format ในWHEREประโยคเพื่อตัดเวลาให้ตรงกับCURDATE()
Taryn

@bluefeet ขอบคุณฉันแก้ไขสคริปต์ของฉันแล้ว ดูเหมือนว่าจะได้ผล แต่เมื่อไม่มีผลลัพธ์ mysql_num_rowsไม่แสดง 0. เป็นเพียงช่องว่าง
Jako

คำตอบ:


205
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()

จำเป็นหรือไม่ที่จะต้องใช้ DATE () แม้ฟิลด์จะเป็นประเภท Date?
rashidnk

2
@rashidnk DATETIMEเลขที่แม้ว่าเขาจะไม่ได้พูดอย่างชัดเจนในคำถามที่สนามเห็นได้ชัดคือประเภท
Barmar

2
แม้ว่าโซลูชันนี้จะถูกต้อง แต่ก็ไม่สามารถปรับขนาดได้ดี (ไม่สามารถใช้ดัชนีsignup_dateได้แม้ว่าจะมีดัชนีดังกล่าวอยู่ก็ตาม ต้องการวิธีการแก้ปัญหาของ Serjio
RandomSeed

หรือหากต้องการค้นหาในวันใดวันหนึ่งโดยมีการใช้ดัชนีด้วย `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') จากผู้ใช้ที่ signup_date> = '2017-08 -30 00:00:00 'และ signup_date <=' 2017-08-30 23:59:59 '; ``
Sumit M Asok

3
@SumitMAsok ดีกว่าที่จะใช้< '2017-08-31 00:00:00'ในกรณีที่คุณใช้ MySQL เวอร์ชันมิลลิวินาที
Barmar

29

แบบสอบถามนี้จะใช้ดัชนีหากคุณมีสำหรับsignup_dateฟิลด์

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)

1
การโหวตลงคะแนนสำหรับคำตอบนี้เป็นเรื่องไร้สาระ นี่เป็นวิธีการที่ต้องการเนื่องจากแบบสอบถามนี้สามารถใช้ประโยชน์จากดัชนีได้signup_dateซึ่งแตกต่างจากแนวทางอื่น ๆ
RandomSeed

2
@RandomSeed แนวคิดทั่วไปของการทดสอบsignup_dateระหว่างสองครั้งนั้นถูกต้อง แต่เวลาไม่ได้ ควรอยู่ระหว่าง00:00และ23:59:59ในวันที่ปัจจุบัน
Barmar

ช่วงวันที่ก็ผิดด้วย>. <การโหวตลดลงก็ไม่ได้ไร้สาระขนาดนั้น
RandomSeed

แบบสอบถามนี้มีประสิทธิภาพมากกว่า (เนื่องจากดัชนี) WHERE DATE(signup_date) = CURDATE()เอาเซิร์ฟเวอร์ ~ 50 มิลลิวินาทีของฉันคนนี้ที่นี่ 0.8 มิลลิวินาที
Kai Noack


1

คุณสามารถใช้CONCATกับได้CURDATE()ตลอดทั้งวันจากนั้นกรองโดยใช้เงื่อนไขBETWEENในWHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.