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

Chuyển cột CHAR sang DATETIME trong MySQL với STR_TO_DATE và REPLACE

Khi cột lưu ngày tháng dưới dạng chuỗi CHAR/VARCHAR với định dạng không chuẩn (VD: '12/31/2017 10:50' — dấu gạch chéo, thứ tự MM/DD/YYYY), dùng STR_TO_DATE() kết hợp REPLACE() để chuẩn hóa phân cách trước khi parse.

Ví dụ minh họa

Tạo bảng cột CHAR:

mysql> CREATE TABLE DemoTable1472 (
    ShippingDate CHAR(35)
);

Chèn dữ liệu (MM/DD/YYYY HH:MI):

mysql> INSERT INTO DemoTable1472 VALUES ('12/31/2017 10:50');
mysql> INSERT INTO DemoTable1472 VALUES ('01/10/2018 12:00');
mysql> INSERT INTO DemoTable1472 VALUES ('03/20/2019 09:30');

Dữ liệu gốc:

mysql> SELECT * FROM DemoTable1472;
+------------------+
| ShippingDate     |
+------------------+
| 12/31/2017 10:50 |
| 01/10/2018 12:00 |
| 03/20/2019 09:30 |
+------------------+

Chuyển sang DATETIME chuẩn

mysql> SELECT STR_TO_DATE(REPLACE(ShippingDate, '/', ','), '%m,%d,%Y %T') 
    FROM DemoTable1472;

Kết quả:

+----------------------------------------------------------+
| STR_TO_DATE(REPLACE(ShippingDate, '/', ','), '%m,%d,%Y %T') |
+----------------------------------------------------------+
| 2017-12-31 10:50:00                                        |
| 2018-01-10 12:00:00                                        |
| 2019-03-20 09:30:00                                        |
+----------------------------------------------------------+

Giải thích từng bước

  1. REPLACE(ShippingDate, '/', ','): Thay '/' bằng ',' → '12,31,2017 10:50'.
  2. STR_TO_DATE(..., '%m,%d,%Y %T'): Parse theo định dạng:
    • %m: Tháng 2 chữ số (12, 01, 03)
    • ,: Ký tự phẩy chữ diện
    • %d: Ngày 2 chữ số (31, 10, 20)
    • ,: Phẩy
    • %Y: Năm 4 chữ số
    • %T: Thời gian 24h (%H:%i:%s)

Cập nhật cột sang kiểu DATETIME vĩnh viễn

-- 1. Thêm cột mới DATETIME
ALTER TABLE DemoTable1472 ADD COLUMN ShippingDateTime DATETIME;

-- 2. Cập nhật dữ liệu chuyển đổi
UPDATE DemoTable1472 
SET ShippingDateTime = STR_TO_DATE(REPLACE(ShippingDate, '/', ','), '%m,%d,%Y %T');

-- 3. (Tuỳ chọn) Xóa cột cũ, đổi tên cột mới
ALTER TABLE DemoTable1472 DROP COLUMN ShippingDate;
ALTER TABLE DemoTable1472 CHANGE ShippingDateTime ShippingDate DATETIME;

Các định dạng thường gặp & format string

Dữ liệu gốcREPLACESTR_TO_DATE format
12/31/2017 10:50/ → ,'%m,%d,%Y %T'
31-12-2017- → - (giữ)'%d-%m-%Y'
2017.12.31. → .'%Y.%m.%d'
Dec 31, 2017(không cần)'%b %d, %Y'
December 31, 2017(không cần)'%M %d, %Y'

Lưu ý

  • Định dạng trong STR_TO_DATE phải khớp chính xác 100% (khoảng trắng, phân cách, chữ hoa/thường tháng).
  • Dữ liệu bẩn (sai format, thiếu phần) sẽ trả về NULL — hãy WHERE converted IS NULL để tìm lỗi.
  • MySQL 8.0+: Có thể tạo VIRTUAL COLUMN tự động parse: ShippingDateTime DATETIME GENERATED ALWAYS AS (STR_TO_DATE(...)) STORED.