Chuyển đổi định dạng ngày chuỗi sang DATE/DATETIME với STR_TO_DATE
Hàm STR_TO_DATE() chuyển chuỗi ngày tháng theo định dạng chỉ định thành giá trị DATE hoặc DATETIME, cho phép so sánh, sắp xếp, tính toán chính xác.
Cú pháp
STR_TO_DATE(chuoi_ngay, dinh_dang_nguon)
Ví dụ minh họa
Tạo bảng DemoTable lưu ngày dạng chuỗi MM-DD-YYYY HH:MM:SS:
mysql> CREATE TABLE DemoTable (DueDate VARCHAR(100)); Query OK, 0 rows affected (0.78 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable VALUES('10-01-2019 10:19:20');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable VALUES('12-03-2018 11:00:00');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable VALUES('02-23-2018 04:20:40');
Query OK, 1 row affected (0.19 sec)
Xem dữ liệu gốc:
mysql> SELECT * FROM DemoTable;
+---------------------+ | DueDate | +---------------------+ | 10-01-2019 10:19:20 | | 12-03-2018 11:00:00 | | 02-23-2018 04:20:40 | +---------------------+ 3 rows in set (0.00 sec)
Chuyển đổi sang DATETIME chuẩn (YYYY-MM-DD HH:MM:SS):
mysql> SELECT STR_TO_DATE(REPLACE(DueDate, '''', ''), '%c-%e-%Y %T') FROM DemoTable;
Kết quả:
+-----------------------------------------------------+ | STR_TO_DATE(REPLACE(DueDate,'''',''), '%c-%e-%Y %T') | +-----------------------------------------------------+ | 2019-10-01 10:19:20 | | 2018-12-03 11:00:00 | | 2018-02-23 04:20:40 | +-----------------------------------------------------+ 3 rows in set (0.00 sec)
Giải thích định dạng '%c-%e-%Y %T'
| Ký tự | Ý nghĩa | Ví dụ input |
|---|---|---|
%c | Tháng (1-12, không đệm 0) | 10, 12, 2 |
%e | Ngày (1-31, không đệm 0) | 1, 3, 23 |
%Y | Năm 4 chữ số | 2019, 2018 |
%T | Giờ:Phút:Giây (=%H:%i:%s) | 10:19:20 |
Lưu ý: REPLACE(DueDate, '''', '') trong ví dụ gốc có vẻ thừa (xóa dấu nháy đơn không tồn tại), có thể bỏ qua nếu dữ liệu sạch.
Các định dạng phổ biến khác
| Định dạng input | Pattern STR_TO_DATE |
|---|---|
dd/mm/yyyy (UK/VN) | '%d/%m/%Y' |
mm/dd/yyyy (US) | '%m/%d/%Y' |
yyyy-mm-dd (ISO) | '%Y-%m-%d' |
dd.mm.yyyy | '%d.%m.%Y' |
dd-mm-yyyy hh:mm:ss | '%d-%m-%Y %H:%i:%s' |
Month dd, yyyy | '%M %d, %Y' |
Ứng dụng thực tế
-- Cập nhật cột DATE mới từ cột VARCHAR cũ ALTER TABLE DemoTable ADD COLUMN DueDateParsed DATETIME; UPDATE DemoTable SET DueDateParsed = STR_TO_DATE(DueDate, '%m-%d-%Y %H:%i:%s'); -- Sau đó tạo index trên DueDateParsed để query nhanh