การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1877 (DueDate DATETIME);
mysql> INSERT INTO DemoTable1877 VALUES
('2019-12-10'), ('2019-12-05'), ('2019-12-07'), ('2019-12-09');
วันที่ปัจจุบัน
mysql> SELECT CURDATE();
+------------+
| curdate() |
+------------+
| 2019-12-08 |
+------------+
Query วันที่น้อยกว่าวันนี้
mysql> SELECT * FROM DemoTable1877 WHERE DueDate < NOW();
ผลลัพธ์ (ก่อน 2019-12-08 00:00:00):
+---------------------+
| DueDate |
+---------------------+
| 2019-12-05 00:00:00 |
| 2019-12-07 00:00:00 |
+---------------------+
NOW() vs CURDATE()
| ฟังก์ชัน | คืนค่า | เหมาะสำหรับ |
|---|---|---|
| NOW() | DATETIME (Date + Time) | DateTime Comparison |
| CURDATE() | DATE (Date Only) | Date Comparison |
| CURRENT_TIMESTAMP | DATETIME (Synonym NOW) | Standard SQL |
Query แบบต่างๆ
-- น้อยกว่าวันนี้ (ไม่รวมวันนี้) - Date Only
WHERE DueDate < CURDATE()
-- น้อยกว่าหรือเท่าวันนี้
WHERE DueDate <= CURDATE()
-- น้อยกว่าวันนี้ 23:59:59 (รวมวันนี้จนจบวัน)
WHERE DueDate < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
-- ใช้ DATE() แยกส่วนวันที่จาก DATETIME
WHERE DATE(DueDate) < CURDATE()
Index Performance
-- Good: SARGable (ใช้ Index ได้)
WHERE DueDate < CURDATE()
WHERE DueDate >= '2019-01-01' AND DueDate < '2019-12-08'
-- Bad: Non-SARGable (ไม่ใช้ Index)
WHERE DATE(DueDate) < CURDATE()
WHERE YEAR(DueDate) = 2019 AND MONTH(DueDate) = 12
Timezone Consideration
NOW()คืนค่าใน Timezone ของ Server (system_time_zone)UTC_TIMESTAMP()คืนค่า UTC- Application ควรจัดการ Timezone เอง (เก็บ UTC, แปลงตอนแสดง)