So sánh chuỗi định dạng ngày trong MySQL với STR_TO_DATE()
Khi cột lưu ngày tháng dưới dạng VARCHAR/TEXT (chuỗi) với định dạng tùy chỉnh (ví dụ: dd.mm.yyyy), cần chuyển đổi sang kiểu DATE bằng STR_TO_DATE() mới so sánh chính xác được.
Cú pháp STR_TO_DATE
STR_TO_DATE(chuoi_ngay, dinh_dang)
Các ký tự định dạng phổ biến
| Ký tự | Ý nghĩa | Ví dụ |
|---|---|---|
%d | Ngày (01-31) | 01, 15, 31 |
%m | Tháng (01-12) | 01, 12 |
%Y | Năm 4 chữ số | 2024 |
%y | Năm 2 chữ số | 24 |
%H | Giờ 24h (00-23) | 14 |
%i | Phút (00-59) | 30 |
%s | Giây (00-59) | 45 |
Ví dụ minh họa
Tạo bảng DemoTable712 lưu ngày dạng dd.mm.yyyy:
mysql> CREATE TABLE DemoTable712 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ArrivalDate VARCHAR(100)
);
Query OK, 0 rows affected (0.65 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable712(ArrivalDate) VALUES('10.01.2019');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable712(ArrivalDate) VALUES('11.12.2018');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable712(ArrivalDate) VALUES('01.11.2017');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable712(ArrivalDate) VALUES('20.06.2016');
Query OK, 1 row affected (0.23 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable712;
+----+-------------+ | Id | ArrivalDate | +----+-------------+ | 1 | 10.01.2019 | | 2 | 11.12.2018 | | 3 | 01.11.2017 | | 4 | 20.06.2016 | +----+-------------+ 4 rows in set (0.00 sec)
So sánh chuỗi ngày với DATE chuẩn (2017-11-01):
mysql> SELECT * FROM DemoTable712 WHERE STR_TO_DATE(ArrivalDate, '%d.%m.%Y') = '2017-11-01';
Kết quả:
+----+-------------+ | Id | ArrivalDate | +----+-------------+ | 3 | 01.11.2017 | +----+-------------+ 1 row in set (0.00 sec)
Các trường hợp sử dụng phổ biến
- Lọc khoảng ngày:
WHERE STR_TO_DATE(date_col, '%d/%m/%Y') BETWEEN '2024-01-01' AND '2024-12-31' - Sắp xếp:
ORDER BY STR_TO_DATE(date_col, '%d-%m-%Y') - Chuyển đổi vĩnh viễn (ALTER TABLE): Thêm cột DATE mới, UPDATE từ cột VARCHAR, drop cột cũ
Lưu ý hiệu suất
STR_TO_DATE()trên cột trong WHERE làm mất index → full table scan- Giải pháp tối ưu: Thêm cột
DATE/DATETIMEriêng, cập nhật bằng trigger hoặc application logic - Nếu phải query thường xuyên: tạo generated column (MySQL 5.7+):
arrival_date_parsed DATE GENERATED ALWAYS AS (STR_TO_DATE(ArrivalDate, '%d.%m.%Y')) STORED, sau đó index cột này