Giới thiệu
Khi cột lưu ngày tháng dưới dạng chuỗi (VARCHAR) với định dạng tùy chỉnh (MM/DD/YYYY), dùng STR_TO_DATE() để chuyển sang DATE/DATETIME trước khi so sánh.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable1565 (
-> ArrivalDatetime varchar(40)
-> );
Query OK, 0 rows affected (0.82 sec)
mysql> insert into DemoTable1565 values('10/01/2019 21:29:35');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable1565 values('10/13/2019 4:56:00');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1565 values('10/13/2018 12:40:46');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1565 values('10/13/2019 21:30:00');
Query OK, 1 row affected (0.58 sec)
2. Dữ liệu gốc
mysql> select * from DemoTable1565;
+---------------------+ | ArrivalDatetime | +---------------------+ | 10/01/2019 21:29:35 | | 10/13/2019 4:56:00 | | 10/13/2018 12:40:46 | | 10/13/2019 21:30:00 | +---------------------+ 4 rows in set (0.00 sec)
3. Ngày hiện tại
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2019-10-13 21:34:14 | +---------------------+ 1 row in set (0.00 sec)
4. Truy vấn chuyển đổi và so sánh
mysql> select * from DemoTable1565
-> where str_to_date(ArrivalDatetime, '%m/%d/%Y') = curdate();
Định dạng %m/%d/%Y: Tháng 2 chữ số / Ngày 2 chữ số / Năm 4 chữ số. Phần giờ bị bỏ qua khi so sánh với curdate() (chỉ so sánh phần ngày).
5. Kết quả
+---------------------+ | ArrivalDatetime | +---------------------+ | 10/13/2019 4:56:00 | | 10/13/2019 21:30:00 | +---------------------+ 2 rows in set, 4 warnings (0.03 sec)
⚠️ Cảnh báo (warnings): Do STR_TO_DATE bỏ qua phần giờ trong pattern, MySQL cảnh báo dữ liệu thừa. Có thể thêm %H:%i:%s vào pattern nếu cần chính xác giờ.
Cách tốt hơn (tránh warning, dùng index):
WHERE STR_TO_DATE(ArrivalDatetime, '%m/%d/%Y %H:%i:%s') >= '2019-10-13' AND STR_TO_DATE(ArrivalDatetime, '%m/%d/%Y %H:%i:%s') < '2019-10-14'
Khuyến nghị: Lưu ngày tháng ở kiểu DATE/DATETIME/TIMESTAMP thay vì VARCHAR.