เมื่อจัดเก็บวันที่เป็นข้อความ (VARCHAR) ในรูปแบบ مثل '01 August 2019' การจัดเรียงตามลำดับวันที่จริงจะไม่ได้ผลถ้าใช้ ORDER BY ธรรมดา เนื่องจากจะเรียงตามตัวอักษร ต้องใช้ฟังก์ชัน STR_TO_DATE() เพื่อแปลงเป็นวันที่จริงก่อนจึงจะเรียงได้ถูกต้อง
ตัวอย่างการใช้งาน
สร้างตารางเก็บวันที่เป็นข้อความ:
mysql> CREATE TABLE DemoTable1435 (
-> DueDate VARCHAR(60)
-> );
เพิ่มข้อมูลวันที่รูปแบบต่างๆ:
mysql> INSERT INTO DemoTable1435 VALUES ('01 August 2019');
mysql> INSERT INTO DemoTable1435 VALUES ('01 Feb 2018');
mysql> INSERT INTO DemoTable1435 VALUES ('31 Jan 2017');
mysql> INSERT INTO DemoTable1435 VALUES ('01 March 2019');
ดูข้อมูลก่อนจัดเรียง:
mysql> SELECT * FROM DemoTable1435; +----------------+ | DueDate | +----------------+ | 01 August 2019 | | 01 Feb 2018 | | 31 Jan 2017 | | 01 March 2019 | +----------------+
จัดเรียงด้วย STR_TO_DATE() โดยระบุรูปแบบวันที่:
mysql> SELECT * FROM DemoTable1435
-> ORDER BY STR_TO_DATE(DueDate, '%d %M %Y');
ผลลัพธ์ที่จัดเรียงถูกต้องตามลำดับเวลา:
+----------------+ | DueDate | +----------------+ | 31 Jan 2017 | | 01 Feb 2018 | | 01 March 2019 | | 01 August 2019 | +----------------+
รูปแบบวันที่ที่ใช้บ่อย (Format Specifiers)
| ตัวอักษร | ความหมาย | ตัวอย่าง |
|---|---|---|
| %d | วัน (00-31) | 01, 31 |
| %M | ชื่อเดือนเต็ม | January, August |
| %b | ชื่อเดือนย่อ | Jan, Aug |
| %Y | ปี 4 หลัก | 2019 |
| %y | ปี 2 หลัก | 19 |
คำแนะนำ
- ควรจัดเก็บวันที่ในชนิดข้อมูล DATE หรือ DATETIME แทน VARCHAR เพื่อประสิทธิภาพและความถูกต้อง
- หากต้องจัดเก็บเป็นข้อความ ให้ใช้รูปแบบมาตรฐาน ISO (YYYY-MM-DD) เพื่อให้เรียงได้โดยไม่ต้องแปลง
- STR_TO_DATE() คืนค่า NULL หากรูปแบบไม่ตรงกัน ดังนั้นควรตรวจสอบข้อมูลก่อนใช้งาน