เมื่อวันที่เก็บใน VARCHAR รูปแบบ DD/MM/YYYY (เช่น 21/11/2019) ต้องใช้ STR_TO_DATE() แปลงเป็น DATE ก่อนจึงจะเปรียบเทียบหรือกรองได้ถูกต้อง
ตัวอย่างการใช้งาน
1. สร้างตารางเก็บวันที่เป็น VARCHAR
mysql> CREATE TABLE DemoTable1808 (
AdmissionDate VARCHAR(20)
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูล (รูปแบบ DD/MM/YYYY)
mysql> INSERT INTO DemoTable1808 VALUES('21/11/2019');
mysql> INSERT INTO DemoTable1808 VALUES('01/01/2018');
mysql> INSERT INTO DemoTable1808 VALUES('26/09/2017');
3. แสดงข้อมูลเดิม
mysql> SELECT * FROM DemoTable1808; +---------------+ | AdmissionDate | +---------------+ | 21/11/2019 | | 01/01/2018 | | 26/09/2017 | +---------------+
4. Query: หาข้อมูลหลังวันที่ 2018-12-31
mysql> SELECT * FROM DemoTable1808
WHERE STR_TO_DATE(AdmissionDate, '%d/%m/%Y') > '2018-12-31';
Format Specifier:
%d: วัน (01-31)%m: เดือน (01-12)%Y: ปี 4 หลัก%d/%m/%Y: ตรงกับ21/11/2019
5. ผลลัพธ์
+---------------+ | AdmissionDate | +---------------+ | 21/11/2019 | +---------------+
⚠️ ประสิทธิภาพ: STR_TO_DATE ใน WHERE
การใช้ Function บนคอลัมน์ใน WHERE (WHERE STR_TO_DATE(col, ...) > ...) จะทำให้ Index ไม่ถูกใช้งาน (Full Table Scan)
แนวทางแก้: Generated Column / Virtual Column (MySQL 5.7+)
ALTER TABLE DemoTable1808
ADD COLUMN AdmissionDateParsed DATE
GENERATED ALWAYS AS (STR_TO_DATE(AdmissionDate, '%d/%m/%Y')) STORED,
ADD INDEX idx_admission_date (AdmissionDateParsed);
แล้ว Query แบบปกติ:
SELECT * FROM DemoTable1808 WHERE AdmissionDateParsed > '2018-12-31';
สรุป
ใช้ STR_TO_DATE(varchar_col, '%d/%m/%Y') แปลงวันที่ DD/MM/YYYY ให้เป็น DATE เพื่อเปรียบเทียบใน WHERE ได้ถูกต้อง แต่ควรสร้าง Generated Column + Index หาก Query บ่อย/ตารางใหญ่