Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cập nhật bản ghi theo năm trích xuất từ chuỗi ngày 'dd/mm/yyyy' trong MySQL

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 DATE thay vì VARCHAR.
  • MySQL 8.0.13+ hỗ trợ Generated Column:
    ALTER TABLE DemoTable 
    ADD COLUMN JoiningYear INT GENERATED ALWAYS AS (YEAR(STR_TO_DATE(UserJoiningDate, '%d/%m/%Y'))) STORED;
    Sau đó tạo index trên JoiningYear.