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
REPLACE(ShippingDate, '/', ','): Thay '/' bằng ',' →'12,31,2017 10:50'.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ốc | REPLACE | STR_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_DATEphả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.
VIRTUAL COLUMN tự động parse: ShippingDateTime DATETIME GENERATED ALWAYS AS (STR_TO_DATE(...)) STORED.