Khi cột ngày lưu dưới dạng chuỗi (VARCHAR) với format tùy chỉnh (ví dụ: dd/mm/yyyy), cần chuyển đổi sang kiểu DATE bằng STR_TO_DATE() trước khi so sánh với CURDATE().
Cú pháp
SELECT * FROM ten_bang WHERE STR_TO_DATE(cot_ngay_chuoi, 'format_specifier') = CURDATE();
Ví dụ minh họa
Giả sử hôm nay là 2019-10-27.
Tạo bảng cột VARCHAR:
CREATE TABLE DemoTable (JoiningDate VARCHAR(40));
INSERT INTO DemoTable VALUES
('27/10/2017'), ('27/10/2018'), ('27/10/2019'), ('27/10/2020');
Truy vấn tìm bản ghi ngày = hôm nay:
SELECT * FROM DemoTable WHERE STR_TO_DATE(JoiningDate, '%d/%m/%Y') = CURDATE();
Kết quả (giả sử hôm nay 27/10/2019)
| JoiningDate |
|---|
| 27/10/2019 |
Các format specifier phổ biến
| Specifier | Ý nghĩa | Ví dụ |
|---|---|---|
| %d | Ngày (01-31) | 27 |
| %m | Tháng (01-12) | 10 |
| %Y | Năm 4 chữ số | 2019 |
| %y | Năm 2 chữ số | 19 |
| %H | Giờ 24h (00-23) | 14 |
| %i | Phút (00-59) | 30 |
| %s | Giây (00-59) | 45 |
⚠️ Hiệu năng & Khuyến nghị
- Không dùng INDEX: Hàm
STR_TO_DATEtrên cột làm index không thể dùng được → full table scan. - Khuyên dùng: Lưu ngày tháng kiểu
DATE,DATETIMEhoặcTIMESTAMPthay vì VARCHAR. - Nếu buộc phải dùng VARCHAR, cân nhắc thêm cột generated column kiểu DATE để index:
ALTER TABLE DemoTable ADD COLUMN JoiningDateParsed DATE GENERATED ALWAYS AS (STR_TO_DATE(JoiningDate, '%d/%m/%Y')) STORED; CREATE INDEX idx_joining_date ON DemoTable(JoiningDateParsed);