คำอธิบาย
ใช้ CURDATE() เพื่อดึงวันที่ปัจจุบัน (ไม่รวมเวลา) และเปรียบเทียบกับคอลัมน์ DATE/DATETIME โดยใช้ DATE() แปลง DATETIME ให้เหลือแค่ส่วนวันที่
ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable (
RegistrationLastDate datetime );
Query OK, 0 rows affected (0.61 sec)
สมมติวันนี้คือ 2019-09-03
การเพิ่มข้อมูล
mysql> insert into DemoTable values('2019-08-01');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('2019-09-03 9:50:56');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('2019-09-03');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2019-09-02');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('2019-09-02 9:50:00');
Query OK, 1 row affected (0.10 sec)
แสดงข้อมูลทั้งหมด
mysql> select * from DemoTable;
ผลลัพธ์:
+----------------------+ | RegistrationLastDate | +----------------------+ | 2019-08-01 00:00:00 | | 2019-09-03 09:50:56 | | 2019-09-03 00:00:00 | | 2019-09-02 00:00:00 | | 2019-09-02 09:50:00 | +----------------------+ 5 rows in set (0.00 sec)
คิวรี่ดึงข้อมูลวันที่ = วันนี้
mysql> select * from DemoTable where DATE(RegistrationLastDate) = CURDATE();
ผลลัพธ์
+----------------------+ | RegistrationLastDate | +----------------------+ | 2019-09-03 09:50:56 | | 2019-09-03 00:00:00 | +----------------------+ 2 rows in set (0.01 sec)
คำอธิบาย
- DATE(RegistrationLastDate): แปลง DATETIME ให้เหลือ DATE (ตัดเวลาออก)
- CURDATE(): คืนค่าวันที่ปัจจุบันของ Server (Format: YYYY-MM-DD)
- เปรียบเทียบได้แม้คอลัมน์จะเป็น DATETIME ก็ตาม
เคล็ดลับประสิทธิภาพ (Performance)
หากตารางใหญ่ ควรสร้าง Index บนคอลัมน์วันที่ และใช้ Range Query แทน:
WHERE RegistrationLastDate >= CURDATE() AND RegistrationLastDate < CURDATE() + INTERVAL 1 DAY
วิธีนี้ใช้ Index ได้ ในขณะที่ DATE() ทำให้ Index ไม่ทำงาน