Giải pháp: DATE_ADD() trong WHERE
So sánh cột ngày với DATE_ADD(NOW(), INTERVAL 10 DAY).
Ví dụ minh họa
Tạo bảng
mysql> CREATE TABLE DemoTable (
ShippingDate DATE
);
Giả sử NOW() = '2019-06-04 20:43:57'
Chèn dữ liệu
mysql> INSERT INTO DemoTable VALUES('2019-06-16');
mysql> INSERT INTO DemoTable VALUES('2019-05-31');
mysql> INSERT INTO DemoTable VALUES('2019-05-24');
mysql> INSERT INTO DemoTable VALUES('2019-06-24');
Truy vấn: Ngày > hôm nay + 10 ngày
mysql> SELECT * FROM DemoTable
-> WHERE ShippingDate > DATE_ADD(NOW(), INTERVAL 10 DAY);
Kết quả (ngày > 2019-06-14)
+--------------+ | ShippingDate | +--------------+ | 2019-06-16 | | 2019-06-24 | +--------------+
Các biến thể INTERVAL
| Cú pháp | Ý nghĩa |
|---|---|
INTERVAL 10 DAY | 10 ngày |
INTERVAL 2 WEEK | 2 tuần |
INTERVAL 1 MONTH | 1 tháng |
INTERVAL 1 YEAR | 1 năm |
INTERVAL 3 HOUR | 3 giờ |
INTERVAL '1 12' DAY_HOUR | 1 ngày 12 giờ |
DATE_ADD vs DATE_SUB
-- Tương đương nhau DATE_ADD(NOW(), INTERVAL 10 DAY) DATE_SUB(NOW(), INTERVAL -10 DAY) NOW() + INTERVAL 10 DAY -- Toán tử + (MySQL extension)
⚠️ Lưu ý hiệu năng (QUAN TRỌNG)
-- ❌ Chậm: Hàm trên cột, không dùng index WHERE DATE(ShippingDate) > DATE_ADD(NOW(), INTERVAL 10 DAY) -- ✅ Nhanh: Hàm chỉ ở vế phải, dùng index ShippingDate WHERE ShippingDate > DATE_ADD(CURDATE(), INTERVAL 10 DAY) -- ✅ Tốt nhất cho DATE column WHERE ShippingDate > CURDATE() + INTERVAL 10 DAY
Mở rộng: Tìm khoảng ngày
-- 10-30 ngày tới
WHERE ShippingDate BETWEEN CURDATE() + INTERVAL 10 DAY
AND CURDATE() + INTERVAL 30 DAY