Cập nhật năm (year) cho cột DATE giữ nguyên tháng/ngày
Dùng DATE_FORMAT(cot, 'nam-moi-%m-%d') trong UPDATE để thay đổi năm mà giữ tháng, ngày.
Cú pháp
UPDATE tenBang
SET cotNgay = DATE_FORMAT(cotNgay, '2019-%m-%d');
Ví dụ minh họa
Bảng ChangeYear:
CREATE TABLE ChangeYear (
id INT NOT NULL AUTO_INCREMENT,
ArrivalTime DATE,
PRIMARY KEY (id)
);
INSERT INTO ChangeYear (ArrivalTime) VALUES
(DATE_ADD(NOW(), INTERVAL -2 YEAR)), -- 2 năm trước
('2012-10-24'), ('2016-03-21'), ('2015-04-24'), (CURDATE());
Dữ liệu ban đầu (giả sử hôm nay 2019-01-07):
+----+-------------+
| id | ArrivalTime |
+----+-------------+
| 1 | 2017-01-07 |
| 2 | 2012-10-24 |
| 3 | 2016-03-21 |
| 4 | 2015-04-24 |
| 5 | 2019-01-07 |
+----+-------------+
Cập nhật tất cả năm thành 2019:
UPDATE ChangeYear
SET ArrivalTime = DATE_FORMAT(ArrivalTime, '2019-%m-%d');
Kết quả
+----+-------------+
| id | ArrivalTime |
+----+-------------+
| 1 | 2019-01-07 |
| 2 | 2019-10-24 |
| 3 | 2019-03-21 |
| 4 | 2019-04-24 |
| 5 | 2019-01-07 |
+----+-------------+
Phương pháp thay thế: DATE_ADD / DATE_SUB
Tính chênh lệch năm rồi cộng/trừ:
UPDATE ChangeYear
SET ArrivalTime = DATE_ADD(ArrivalTime, INTERVAL (2019 - YEAR(ArrivalTime)) YEAR);
Cách này linh hoạt hơn nếu muốn set năm dựa trên năm hiện tại của từng hàng.
Lưu ý
DATE_FORMATtrả về STRING, MySQL tự cast ngược thành DATE khi gán vào cột DATE.- Ngày 29/2 năm nhuận: Nếu set năm không nhuận, MySQL điều chỉnh thành 28/2 (không lỗi).
- Có index trên cột DATE → UPDATE sẽ cập nhật index (chi phí ghi).