จะเปรียบเทียบวันที่ประทับเวลากับพารามิเตอร์วันที่เท่านั้นใน MySQL ได้อย่างไร


91

ในคำสั่ง SQL ฉันจะเปรียบเทียบวันที่ที่บันทึกเป็น TIMESTAMP กับวันที่ในรูปแบบ YYYY-MM-DD ได้อย่างไร

เช่น: SELECT * FROM table WHERE timestamp = '2012-05-25'

ฉันต้องการให้ข้อความค้นหานี้ส่งคืนแถวทั้งหมดที่มีการประทับเวลาในวันที่ระบุ แต่จะส่งกลับเฉพาะแถวที่มีการประทับเวลาเที่ยงคืน

ขอบคุณ

คำตอบ:


150

คุณสามารถใช้DATE()ฟังก์ชันเพื่อแยกส่วนวันที่ของการประทับเวลา:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'

แม้ว่าคุณจะมีดัชนีในคอลัมน์การประทับเวลาสิ่งนี้จะเร็วกว่าเนื่องจากสามารถใช้ดัชนีในคอลัมน์การประทับเวลาได้หากคุณมี:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'

6
จากการทดสอบเล็ก ๆ ที่ฉันเพิ่งวิ่งฉันพบว่าการใช้ BETWEEN จะเร็วขึ้นโดยปัจจัย 10X Just FYI
DarbyM

1
ใช้วันที่ที่ชัดเจนว่าตัวเลขหมายถึงประเภทใด
Lukas Salich


7

ตามที่บางคนแนะนำโดยการใช้DATE(timestamp)คุณกำลังใช้การปรับแต่งกับคอลัมน์ดังนั้นคุณจึงไม่สามารถพึ่งพาลำดับดัชนี

อย่างไรก็ตามการใช้BETWEENจะเชื่อถือได้ก็ต่อเมื่อคุณรวมมิลลิวินาที ในตัวอย่างการประทับเวลาBETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'คุณยกเว้นระเบียนที่มีการประทับเวลาระหว่างและ2012-05-05 23:59:59.001 2012-05-05 23:59:59.999อย่างไรก็ตามแม้วิธีนี้จะมีปัญหาอยู่บ้างเนื่องจากความแม่นยำของประเภทข้อมูล มีการปัดเศษขึ้นในบางครั้ง 999 มิลลิวินาที

สิ่งที่ควรทำที่สุดคือ:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'



1

ในขณะที่ฉันกำลังค้นคว้าข้อมูลนี้ฉันคิดว่ามันจะเป็นการดีที่จะแก้ไขโซลูชัน BETWEEN เพื่อแสดงตัวอย่างสำหรับวันที่ / สตริงที่ไม่คงที่โดยเฉพาะ แต่เป็นวันที่ที่ผันแปรหรือวันนี้เช่นCURRENT_DATE(). สิ่งนี้จะใช้ดัชนีในคอลัมน์ log_timestamp

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

ฉันทำวินาที / ไมโครวินาทีเพื่อหลีกเลี่ยงกรณี 12.00 น. ในวันถัดไป อย่างไรก็ตามคุณยังสามารถทำ `` INTERVAL '1 DAY' ผ่านตัวดำเนินการเปรียบเทียบสำหรับวิธีการที่ไม่เป็นมิตรกับผู้อ่านมากขึ้น:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

ทั้งสองวิธีนี้จะใช้ดัชนีและควรดำเนินการได้เร็วขึ้นมาก ทั้งสองดูเหมือนจะเร็วพอ ๆ กัน


0

ในกรณีที่คุณใช้พารามิเตอร์ SQL เพื่อเรียกใช้แบบสอบถามสิ่งนี้จะเป็นประโยชน์

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

0

เมื่อฉันอ่านคำถามของคุณฉันคิดว่าคุณอยู่ในOracle DBจนกระทั่งฉันเห็นแท็ก 'MySQL' อย่างไรก็ตามสำหรับคนที่ทำงานกับ Oracle นี่คือวิธี:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

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