Giải pháp: DATE_ADD() với INTERVAL
Hàm DATE_ADD(date, INTERVAL expr unit) cộng interval vào ngày.
Ví dụ minh họa
Tạo bảng
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ShippingDate DATETIME
);
Giả sử NOW() = '2019-06-02 10:36:49'
Chèn ngày + 2 tuần
mysql> INSERT INTO DemoTable(ShippingDate)
-> VALUES(DATE_ADD(NOW(), INTERVAL 2 WEEK));
Kết quả
+----+-----------------------+ | Id | ShippingDate | +----+-----------------------+ | 1 | 2019-06-16 10:37:24 | +----+-----------------------+
Các đơn vị INTERVAL
| Unit | Ví dụ | Kết quả |
|---|---|---|
| MICROSECOND | INTERVAL 500 MICROSECOND | +0.0005s |
| SECOND | INTERVAL 30 SECOND | +30s |
| MINUTE | INTERVAL 15 MINUTE | +15p |
| HOUR | INTERVAL 2 HOUR | +2h |
| DAY | INTERVAL 10 DAY | +10 ngày |
| WEEK | INTERVAL 2 WEEK | +14 ngày |
| MONTH | INTERVAL 1 MONTH | +1 tháng |
| QUARTER | INTERVAL 1 QUARTER | +3 tháng |
| YEAR | INTERVAL 1 YEAR | +1 năm |
| DAY_HOUR | INTERVAL '1 12' DAY_HOUR | 1 ngày 12h |
| YEAR_MONTH | INTERVAL '1-6' YEAR_MONTH | 1 năm 6 tháng |
Cú pháp thay thế
-- Toán tử + (MySQL extension) SELECT NOW() + INTERVAL 2 WEEK; -- DATE_SUB (trừ) SELECT DATE_SUB(NOW(), INTERVAL 2 WEEK); -- 2 tuần trước -- DATE_FORMAT cho output SELECT DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 2 WEEK), '%Y-%m-%d');
Ứng dụng: Tính hạn chót, lịch hẹn
-- Hạn thanh toán 14 ngày từ ngày đặt hàng
SELECT order_id,
order_date,
DATE_ADD(order_date, INTERVAL 14 DAY) AS due_date
FROM orders;
-- Lịch khám tái khám 2 tuần
UPDATE appointments
SET followup_date = DATE_ADD(appointment_date, INTERVAL 2 WEEK)
WHERE type = 'checkup';
Lưu ý
- DATE_ADD trả về cùng kiểu với input (DATE → DATE, DATETIME → DATETIME)
- Tháng:
INTERVAL 1 MONTHtừ 31/01 → 28/02 (hoặc 29/02), không phải 30 ngày - DST (Daylight Saving Time): TIMESTAMP tự điều chỉnh, DATETIME không