การค้นหา 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 — เร็วที่สุดและถูกต้อง