Cú pháp
Sử dụng hàm DATE_ADD() với INTERVAL:
DATE_ADD(ngay_goc, INTERVAL so_luong DON_VI)
Ví dụ: Thêm ngày vào datetime/date
1. Tạo bảng
mysql> CREATE TABLE addingDaysDemo ( -> yourDateTime DATETIME -> ); Query OK, 0 rows affected (1.09 sec)
2. Chèn dữ liệu với NOW() và CURDATE()
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 1 DAY)); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 4 DAY)); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 5 DAY)); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 7 DAY)); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 9 DAY)); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 1 DAY)); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 4 DAY)); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 5 DAY)); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 7 DAY)); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 9 DAY)); Query OK, 1 row affected (0.15 sec)
3. Kết quả (NOW() có giờ, CURDATE() giờ = 00:00:00)
mysql> SELECT * FROM addingDaysDemo;
+---------------------+ | yourDateTime | +---------------------+ | 2018-12-14 15:36:57 | | 2018-12-17 15:37:06 | | 2018-12-18 15:37:12 | | 2018-12-20 15:37:17 | | 2018-12-22 15:37:21 | | 2018-12-14 00:00:00 | | 2018-12-17 00:00:00 | | 2018-12-18 00:00:00 | | 2018-12-20 00:00:00 | | 2018-12-22 00:00:00 | +---------------------+ 10 rows in set (0.00 sec)
Các đơn vị INTERVAL đầy đủ
| Đơn vị | Ví dụ | Mô tả |
|---|---|---|
| MICROSECOND | INTERVAL 500 MICROSECOND | Micro giây |
| SECOND | INTERVAL 30 SECOND | Giây |
| MINUTE | INTERVAL 45 MINUTE | Phút |
| HOUR | INTERVAL 2 HOUR | Giờ |
| DAY | INTERVAL 7 DAY | Ngày |
| WEEK | INTERVAL 1 WEEK | Tuần |
| MONTH | INTERVAL 3 MONTH | Tháng |
| QUARTER | INTERVAL 2 QUARTER | Quý (3 tháng) |
| YEAR | INTERVAL 1 YEAR | Năm |
| DAY_HOUR | INTERVAL '1 12' DAY_HOUR | 1 ngày 12 giờ |
| DAY_MINUTE | INTERVAL '1 12:30' DAY_MINUTE | 1 ngày 12h30 |
| DAY_SECOND | INTERVAL '1 12:30:45' DAY_SECOND | 1 ngày 12h30m45s |
Trừ ngày (DATE_SUB)
-- Trừ 10 ngày SELECT DATE_SUB(NOW(), INTERVAL 10 DAY); -- Hoặc dùng âm với DATE_ADD SELECT DATE_ADD(NOW(), INTERVAL -10 DAY);
Ứng dụng thực tế
Tính hạn thanh toán (Due date = Created + 30 ngày)
SELECT
invoice_id,
created_at,
DATE_ADD(created_at, INTERVAL 30 DAY) AS due_date
FROM invoices;
Lọc bản ghi trong 7 ngày qua
SELECT * FROM orders WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);
Tính ngày sinh nhật năm nay
SELECT
name,
DATE_ADD(birthdate, INTERVAL (YEAR(CURDATE()) - YEAR(birthdate)) YEAR) AS birthday_this_year
FROM users;
Lưu ý
NOW()= DATE + TIME (thời điểm thực thi)CURDATE()= chỉ DATE (giờ = 00:00:00)- MySQL tự xử lý ngày cuối tháng, năm nhuận
- Index trên cột DATE/DATETIME tăng tốc WHERE với DATE_ADD/SUB