Giới thiệu
Sử dụng toán tử so sánh < với hàm NOW() (hoặc CURDATE() cho cột DATE) để lọc các bản ghi có ngày/giờ trong quá khứ so với thời điểm hiện tại.
Ví dụ thực hành
1. Tạo bảng DemoTable840
mysql> CREATE TABLE DemoTable840 (DueDate DATETIME);
2. Chèn dữ liệu (giả sử hôm nay 2019-08-03)
mysql> INSERT INTO DemoTable840 VALUES
('2019-08-09'),('2019-07-05'),('2019-08-10'),('2019-07-13');
3. Truy vấn các hàng DueDate < NOW()
mysql> SELECT * FROM DemoTable840 WHERE DueDate < NOW();
4. Kết quả (các ngày đã qua: 07-05, 07-13)
+-----------------------+
| DueDate |
+-----------------------+
| 2019-07-05 00:00:00 |
| 2019-07-13 00:00:00 |
+-----------------------+
Các biến thể thường dùng
-- Chỉ so sánh ngày (bỏ qua giờ) - dùng CURDATE()
SELECT * FROM DemoTable840 WHERE DATE(DueDate) < CURDATE();
-- Hôm nay và quá khứ (<=)
SELECT * FROM DemoTable840 WHERE DueDate <= NOW();
-- Tương lai (> NOW())
SELECT * FROM DemoTable840 WHERE DueDate > NOW();
-- Trong vòng 7 ngày tới
SELECT * FROM DemoTable840
WHERE DueDate BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 7 DAY);
Lưu ý hiệu suất
- Tránh dùng hàm trên cột trong WHERE:
DATE(DueDate) < CURDATE()làm mất index trênDueDate. - Viết lại:
DueDate < CURDATE()(nếu cột là DATE) hoặcDueDate < DATE(NOW())(nếu cột DATETIME). - Tạo index cho cột ngày thường xuyên lọc:
INDEX idx_due (DueDate).