เมื่อคอลัมน์เป็น DATETIME (มีทั้ง Date และ Time) ต้องการดึงเฉพาะข้อมูลวันนี้ ให้ใช้ DATE() แยกส่วนวันที่ หรือ DATE_SUB(CURDATE(), INTERVAL 1 DAY) สำหรับช่วง 24 ชม.
สร้างตารางมี ShippingDate (DATETIME)
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
ShippingDate datetime
);
เพิ่มข้อมูล
mysql> insert into DemoTable(ShippingDate) values
('2019-03-01 05:45:32'),('2019-04-13 11:34:56'),
('2019-03-15 04:45:23'),('2019-04-11 12:10:02');
ข้อมูลในตาราง
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 1 | 2019-03-01 05:45:32 | | 2 | 2019-04-13 11:34:56 | | 3 | 2019-03-15 04:45:23 | | 4 | 2019-04-11 12:10:02 | +----+---------------------+
คำสั่ง: ดึงข้อมูลวันที่ 2019-04-13 (สมมติวันนี้)
mysql> select * from DemoTable where ShippingDate > date_sub(curdate(), interval 1 day);
ผลลัพธ์
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 2 | 2019-04-13 11:34:56 | +----+---------------------+
คำอธิบาย
CURDATE()= '2019-04-13' (สมมติ)DATE_SUB(CURDATE(), INTERVAL 1 DAY)= '2019-04-12'ShippingDate > '2019-04-12'→ DATETIME > DATE → MySQL แปลง DATE เป็น '2019-04-12 00:00:00'- ดังนั้น ได้ข้อมูลจาก '2019-04-12 00:00:00' ถึง '2019-04-13 23:59:59'
วิธีอื่น: ใช้ DATE() แยกวันที่
-- เทียบเฉพาะ Date Part SELECT * FROM DemoTable WHERE DATE(ShippingDate) = CURDATE();
- อ่านง่าย แต่ ไม่ใช้ Index ได้ (Function on Column)
Best Practice: Range Query (SARGable - ใช้ Index ได้)
-- วันนี้ (Midnight to Midnight) WHERE ShippingDate >= CURDATE() AND ShippingDate < CURDATE() + INTERVAL 1 DAY -- หรือ DATE_SUB สำหรับ "24 ชม. ย้อนหลัง" WHERE ShippingDate >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
Index สำหรับ DATETIME Range
CREATE INDEX idx_shipping_date ON DemoTable(ShippingDate);
MySQL 8.0+ Functional Index สำหรับ DATE()
ALTER TABLE DemoTable ADD INDEX idx_shipping_date_only ((DATE(ShippingDate)));