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

MySQL UPDATE คอลัมน์โดยจับคู่วันที่ด้วย DATE() function

ใช้ 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 ได้