ใช้ DATE(datetime_col) แปลง DATETIME/TIMESTAMP ให้เป็น DATE เท่านั้น เพื่อจับคู่กับ CURDATE() (วันที่ปัจจุบัน) ในเงื่อนไข UPDATE
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1816 (
Name VARCHAR(20),
JoiningDate DATETIME
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable1816 VALUES('Chris', '2019-11-29 12:34:50');
mysql> INSERT INTO DemoTable1816 VALUES('David', '2019-11-30 11:00:00');
mysql> INSERT INTO DemoTable1816 VALUES('Mike', '2018-11-30 10:20:30');
3. แสดงข้อมูลก่อนอัปเดต
mysql> SELECT * FROM DemoTable1816; +-------+---------------------+ | Name | JoiningDate | +-------+---------------------+ | Chris | 2019-11-29 12:34:50 | | David | 2019-11-30 11:00:00 | | Mike | 2018-11-30 10:20:30 | +-------+---------------------+
4. UPDATE: เปลี่ยน Name เป็น 'Robert' เฉพาะแถวที่ JoiningDate เป็นวันนี้
mysql> UPDATE DemoTable1816
SET Name = 'Robert'
WHERE DATE(JoiningDate) = CURDATE();
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
สมมติ CURDATE() = '2019-11-30'
DATE('2019-11-29 12:34:50')='2019-11-29'≠ CURDATE()DATE('2019-11-30 11:00:00')='2019-11-30'= CURDATE() ✓DATE('2018-11-30 10:20:30')='2018-11-30'≠ CURDATE()
5. ผลลัพธ์หลังอัปเดต
mysql> SELECT * FROM DemoTable1816; +--------+---------------------+ | Name | JoiningDate | +--------+---------------------+ | Chris | 2019-11-29 12:34:50 | | Robert | 2019-11-30 11:00:00 | | Mike | 2018-11-30 10:20:30 | +--------+---------------------+
⚠️ ประสิทธิภาพ: Function บน Column ใน WHERE
WHERE DATE(JoiningDate) = CURDATE() จะทำให้ Index บน JoiningDate ไม่ถูกใช้งาน
แนวทางแก้: ใช้ Range Query (Sargable)
WHERE JoiningDate >= CURDATE() AND JoiningDate < CURDATE() + INTERVAL 1 DAY
วิธีนี้ใช้ Index ได้ (Index Range Scan) เร็วกว่ามากสำหรับตารางใหญ่
ฟังก์ชันวันที่ที่เกี่ยวข้อง
| ฟังก์ชัน | คำอธิบาย |
|---|---|
DATE(datetime) | ดึงเฉพาะส่วน DATE |
TIME(datetime) | ดึงเฉพาะส่วน TIME |
CURDATE() | วันที่ปัจจุบัน (DATE) |
NOW() | วันที่เวลาปัจจุบัน (DATETIME) |
สรุป
ใช้ WHERE DATE(datetime_col) = CURDATE() สำหรับ Query Ad-hoc/ตารางเล็ก สำหรับ Production/ตารางใหญ่ ควรใช้ WHERE datetime_col >= CURDATE() AND datetime_col < CURDATE() + INTERVAL 1 DAY เพื่อให้ใช้ Index ได้