Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: วิธีเร็วที่สุดค้นหา วันที่จากคอลัมน์ DATETIME ด้วย BETWEEN

การค้นหา Date Range ใน DATETIME ด้วย BETWEEN (เร็วและอ่านง่าย)

ใช้ BETWEEN กรองช่วงวันที่/เวลา — ใช้ Index ได้ (SARGable) และรวมค่าขอบเขต (inclusive)

สร้างตารางและข้อมูล

mysql> create table DemoTable1413 (
    -> EmployeeName varchar(20),
    -> EmployeeJoiningDate datetime
    -> );
Query OK, 0 rows affected (0.45 sec)

mysql> insert into DemoTable1413 values('Chris', '2018-09-28 11:10:50');
mysql> insert into DemoTable1413 values('David', '2019-09-28 11:10:50');
mysql> insert into DemoTable1413 values('Mike', '2019-09-29 12:40:00');
mysql> insert into DemoTable1413 values('Carol', '2019-09-28 12:06:10');

ข้อมูลทั้งหมด

+--------------+---------------------+
| EmployeeName | EmployeeJoiningDate |
+--------------+---------------------+
| Chris        | 2018-09-28 11:10:50 |
| David        | 2019-09-28 11:10:50 |
| Mike         | 2019-09-29 12:40:00 |
| Carol        | 2019-09-28 12:06:10 |
+--------------+---------------------+

คำสั่ง BETWEEN หาวันที่ 2019-09-28 ทั้งวัน

mysql> select * from DemoTable1413
    -> where EmployeeJoiningDate between '2019-09-28' and '2019-09-28 23:59:59'
    -> limit 1;

ผลลัพธ์

+--------------+---------------------+
| EmployeeName | EmployeeJoiningDate |
+--------------+---------------------+
| David        | 2019-09-28 11:10:50 |
+--------------+---------------------+

การทำงานของ BETWEEN กับ DATETIME

  • '2019-09-28' → ถูกตีความเป็น '2019-09-28 00:00:00'
  • BETWEEN '2019-09-28' AND '2019-09-28 23:59:59' → ครอบคลุมทั้งวัน 28 กันยายน
  • Inclusive: รวมค่าขอบเขตทั้งสองข้าง

รูปแบบที่แนะนำ (Best Practice): Half-open Interval

WHERE EmployeeJoiningDate >= '2019-09-28'
  AND EmployeeJoiningDate < '2019-09-29'

ข้อดี: ไม่ต้องคำนวณ 23:59:59, รองรับ microsecond, ชัดเจนกว่า

ประสิทธิภาพและ Index

  • คอลัมน์ DATETIME ที่มี Index — BETWEEN และ >= ... < ใช้ Index Range Scan ได้
  • หลีกเลี่ยง function บนคอลัมน์: WHERE DATE(EmployeeJoiningDate) = '2019-09-28' → Full Table Scan
  • Covering Index: INDEX idx_join_date_name (EmployeeJoiningDate, EmployeeName) — query เร็วขึ้น (Index Only Scan)

MySQL 8.0+: FUNCTIONAL INDEX (สำหรับ DATE() extraction)

ALTER TABLE DemoTable1413 
ADD INDEX idx_date_only ((DATE(EmployeeJoiningDate)));

แล้ว WHERE DATE(EmployeeJoiningDate) = '2019-09-28' จะใช้ index ได้

สรุป: ใช้ BETWEEN หรือ half-open interval บนคอลัมน์ DATETIME ที่มี Index — เร็วที่สุดและถูกต้อง