Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL ใช้ STR_TO_DATE แปลงวันที่รูปแบบ DD/MM/YYYY แล้วกรองด้วย WHERE

เมื่อวันที่เก็บใน 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 บ่อย/ตารางใหญ่