Vấn đề: UPDATE dựa trên năm từ cột ngày lưu dưới dạng chuỗi 'dd/mm/yyyy'
Cột UserJoiningDate kiểu VARCHAR lưu ngày như '10/12/2010'. Cần cập nhật UserName cho các hàng có năm 2010.
Giải pháp: STR_TO_DATE + YEAR trong WHERE
Chuyển chuỗi thành DATE bằng STR_TO_DATE với format '%d/%m/%Y', sau đó lấy năm bằng YEAR().
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
UserName VARCHAR(20),
UserJoiningDate VARCHAR(40)
);
INSERT INTO DemoTable VALUES
('Chris', '10/12/2010'),
('David', '20/01/2011'),
('Mike', '20/01/2010'),
('Carol', '26/04/2013');
2. Cập nhật năm 2010
UPDATE DemoTable
SET UserName = 'Robert'
WHERE YEAR(STR_TO_DATE(UserJoiningDate, '%d/%m/%Y')) = 2010;
3. Kết quả
+----------+-----------------+
| UserName | UserJoiningDate |
+----------+-----------------+
| Robert | 10/12/2010 |
| David | 20/01/2011 |
| Robert | 20/01/2010 |
| Carol | 26/04/2013 |
+----------+-----------------+
Giải thích format STR_TO_DATE
%d– Ngày (2 chữ số, 01-31)%m– Tháng (2 chữ số, 01-12)%Y– Năm (4 chữ số)- Dấu phân cách
/phải khớp chính xác với dữ liệu.
Lưu ý hiệu suất
- Hàm trên cột (
STR_TO_DATE,YEAR) làm mất chỉ mục – full table scan. - Nếu thường xuyên truy vấn theo năm, cân nhắc:
- Thêm cột
JoiningYear INT(generated column hoặc trigger cập nhật). - Lưu ngày đúng kiểu
DATEthay vì VARCHAR.
- Thêm cột
- MySQL 8.0.13+ hỗ trợ
Generated Column:
Sau đó tạo index trênALTER TABLE DemoTable ADD COLUMN JoiningYear INT GENERATED ALWAYS AS (YEAR(STR_TO_DATE(UserJoiningDate, '%d/%m/%Y'))) STORED;JoiningYear.