Để thay đổi năm của các giá trị ngày (ví dụ: từ 2020 sang 2011), bạn dùng DATE_SUB() hoặc SUBDATE() với INTERVAL 9 YEAR (khoảng cách 9 năm).
Cú pháp
UPDATE ten_bang
SET ten_cot_ngay = DATE_SUB(ten_cot_ngay, INTERVAL 9 YEAR);
-- Hoặc
UPDATE ten_bang
SET ten_cot_ngay = SUBDATE(ten_cot_ngay, INTERVAL 9 YEAR);
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE ChangeYearFrom2020To2011 (
Id INT NOT NULL AUTO_INCREMENT,
ExpiryDate DATE,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu (tất cả năm 2020)
INSERT INTO ChangeYearFrom2020To2011(ExpiryDate) VALUES
('2020-09-12'), ('2020-12-21'), ('2020-01-29'),
('2020-06-30'), ('2020-12-31');
3. Xem dữ liệu gốc
SELECT * FROM ChangeYearFrom2020To2011;
Kết quả:
+----+------------+
| Id | ExpiryDate |
+----+------------+
| 1 | 2020-09-12 |
| 2 | 2020-12-21 |
| 3 | 2020-01-29 |
| 4 | 2020-06-30 |
| 5 | 2020-12-31 |
+----+------------+
4. Cập nhật: Trừ 9 năm (2020 → 2011)
UPDATE ChangeYearFrom2020To2011
SET ExpiryDate = SUBDATE(ExpiryDate, INTERVAL 9 YEAR);
Kết quả: Query OK, 5 rows affected
5. Kiểm tra sau cập nhật
SELECT * FROM ChangeYearFrom2020To2011;
Kết quả:
+----+------------+
| Id | ExpiryDate |
+----+------------+
| 1 | 2011-09-12 |
| 2 | 2011-12-21 |
| 3 | 2011-01-29 |
| 4 | 2011-06-30 |
| 5 | 2011-12-31 |
+----+------------+
Các cách thay đổi năm khác
Cách 1: DATE_ADD với INTERVAL âm
UPDATE bang SET ngay = DATE_ADD(ngay, INTERVAL -9 YEAR);
Cách 2: DATE_FORMAT + STR_TO_DATE (tách năm, ghép lại)
UPDATE bang
SET ngay = STR_TO_DATE(
CONCAT('2011-', DATE_FORMAT(ngay, '%m-%d')),
'%Y-%m-%d');
Cách 3: Cập nhật có điều kiện (chỉ năm 2020)
UPDATE bang
SET ngay = DATE_SUB(ngay, INTERVAL 9 YEAR)
WHERE YEAR(ngay) = 2020;
Bảng INTERVAL unit cho năm
| Unit | Ví dụ |
|---|---|
YEAR | INTERVAL 1 YEAR |
QUARTER | INTERVAL 1 QUARTER (3 tháng) |
MONTH | INTERVAL 1 MONTH |
WEEK | INTERVAL 1 WEEK |
DAY | INTERVAL 1 DAY |
⚠️ Lưu ý quan trọng
- Backup trước khi UPDATE hàng loạt:
CREATE TABLE bang_backup AS SELECT * FROM bang; - Kiểm tra trước bằng SELECT:
SELECT ngay, DATE_SUB(ngay, INTERVAL 9 YEAR) FROM bang; - Xử lý ngày 29/02 năm nhuận:
DATE_SUB('2020-02-29', INTERVAL 1 YEAR)→2019-02-28(MySQL tự điều chỉnh) - Dùng transaction:
START TRANSACTION; UPDATE ...; COMMIT;/ROLLBACK; - Index trên cột ngày vẫn hoạt động sau UPDATE