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

So sánh chuỗi ngày (date strings) trong MySQL

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