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

เลือกวันที่น้อยกว่าวันปัจจุบันใน MySQL

การเตรียมข้อมูล

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_TIMESTAMPDATETIME (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, แปลงตอนแสดง)