เมื่อวันที่เก็บเป็น VARCHAR ต้องแปลงด้วย STR_TO_DATE() ก่อนเปรียบเทียบกับ CURDATE()
สร้างตารางตัวอย่าง
mysql> create table DemoTable (
AdmissionDate varchar(50) );
Query OK, 0 rows affected (0.63 sec)
หมายเหตุ: สมมติวันนี้คือ 14-Sep-2019
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable values('15-Sep-2019'); Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('14-Sep-2019'); Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('13-Sep-2016'); Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('13-Sep-2019'); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('13-Sep-2020'); Query OK, 1 row affected (0.10 sec)
แสดงข้อมูลทั้งหมด
mysql> select *from DemoTable;
+---------------+ | AdmissionDate | +---------------+ | 15-Sep-2019 | | 14-Sep-2019 | | 13-Sep-2016 | | 13-Sep-2019 | | 13-Sep-2020 | +---------------+ 5 rows in set (0.00 sec)
คิวรี่เปรียบเทียบวันที่น้อยกว่าวันปัจจุบัน
mysql> select *from DemoTable where str_to_date(AdmissionDate,'%d-%b-%Y') < CURDATE();
ผลลัพธ์ (วันที่ก่อน 14-Sep-2019):
+---------------+ | AdmissionDate | +---------------+ | 13-Sep-2016 | | 13-Sep-2019 | +---------------+ 2 rows in set (0.00 sec)
คำอธิบาย Format Specifier
%d- วัน (01-31)%b- ชื่อเดือนย่อ 3 ตัว (Jan, Feb, Mar, ..., Sep)%Y- ปี 4 หลัก
กรณีวันที่เป็นชนิด DATE แล้ว
-- ไม่ต้องแปลง WHERE AdmissionDate < CURDATE() -- หรือใช้ DATE() หากเป็น DATETIME WHERE DATE(AdmissionDate) < CURDATE()
ประสิทธิภาพ
การใช้ STR_TO_DATE() บนคอลัมน์จะทำให้ Full Table Scan ควรพิจารณา:
- เปลี่ยนชนิดคอลัมน์เป็น DATE
- เพิ่ม Generated Column:
ADD admission_date_parsed DATE GENERATED ALWAYS AS (STR_TO_DATE(AdmissionDate, '%d-%b-%Y')) STORED - เพิ่ม Index ให้ Generated Column