Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm bản ghi có ngày khớp với ngày hiện tại trong MySQL

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ĩaVí dụ
%dNgày (01-31)27
%mTháng (01-12)10
%YNăm 4 chữ số2019
%yNăm 2 chữ số19
%HGiờ 24h (00-23)14
%iPhút (00-59)30
%sGiây (00-59)45

⚠️ Hiệu năng & Khuyến nghị

  • Không dùng INDEX: Hàm STR_TO_DATE trê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, DATETIME hoặc TIMESTAMP thay 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);