Cú pháp cơ bản
Sử dụng UPDATE kết hợp hàm DATE_ADD() hoặc gán trực tiếp:
UPDATE ten_bang SET cot_moi = DATE_ADD(cot_goc, INTERVAL n DAY) WHERE dieu_kien;
Ví dụ chi tiết
1. Tạo bảng
mysql> CREATE TABLE AddDateTimeWithOther ( -> Id INT, -> IssueDate DATETIME, -> DueDate DATETIME -> ); Query OK, 0 rows affected (0.69 sec)
2. Chèn dữ liệu (DueDate = IssueDate ± interval)
mysql> INSERT INTO AddDateTimeWithOther VALUES(100, NOW(), DATE_ADD(NOW(), INTERVAL -3 YEAR)); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO AddDateTimeWithOther VALUES(101, NOW(), DATE_ADD(NOW(), INTERVAL 2 YEAR)); Query OK, 1 row affected (0.20 sec)
3. Dữ liệu ban đầu
mysql> SELECT * FROM AddDateTimeWithOther;
+------+---------------------+---------------------+ | Id | IssueDate | DueDate | +------+---------------------+---------------------+ | 100 | 2018-12-11 17:33:28 | 2015-12-11 17:33:28 | | 101 | 2018-12-11 17:33:37 | 2020-12-11 17:33:37 | +------+---------------------+---------------------+ 2 rows in set (0.00 sec)
4. Cập nhật DueDate cho Id=100
mysql> UPDATE AddDateTimeWithOther -> SET DueDate = DATE_ADD(NOW(), INTERVAL 1 YEAR) -> WHERE Id = 100; Query OK, 1 row affected (0.24 sec) Rows matched: 1 Changed: 1 Warnings: 0
5. Kết quả sau cập nhật
mysql> SELECT * FROM AddDateTimeWithOther;
+------+---------------------+---------------------+ | Id | IssueDate | DueDate | +------+---------------------+---------------------+ | 100 | 2018-12-11 17:33:28 | 2019-12-11 17:35:03 | | 101 | 2018-12-11 17:33:37 | 2020-12-11 17:33:37 | +------+---------------------+---------------------+ 2 rows in set (0.00 sec)
Các đơn vị INTERVAL phổ biến
| Đơn vị | Ví dụ | Mô tả |
|---|---|---|
| SECOND | INTERVAL 30 SECOND | 30 giây |
| MINUTE | INTERVAL 45 MINUTE | 45 phút |
| HOUR | INTERVAL 2 HOUR | 2 giờ |
| DAY | INTERVAL 7 DAY | 7 ngày |
| WEEK | INTERVAL 1 WEEK | 1 tuần |
| MONTH | INTERVAL 3 MONTH | 3 tháng |
| YEAR | INTERVAL 1 YEAR | 1 năm |
| DAY_HOUR | INTERVAL '1 12' DAY_HOUR | 1 ngày 12 giờ |
Các hàm xử lý datetime hữu ích
-- Chênh lệch 2 datetime (giây) SELECT TIMESTAMPDIFF(SECOND, IssueDate, DueDate) FROM ten_bang; -- Chỉ lấy phần ngày SELECT DATE(IssueDate) FROM ten_bang; -- Cộng/trừ trực tiếp UPDATE ten_bang SET DueDate = IssueDate + INTERVAL 30 DAY; -- Format hiển thị SELECT DATE_FORMAT(DueDate, '%d/%m/%Y %H:%i') FROM ten_bang;
Lưu ý
NOW()trả về thời điểm thực thi câu lệnh- Sử dụng
DATE_ADD()/DATE_SUB()cho rõ ràng - Index trên cột datetime tăng tốc WHERE/ORDER BY