เมื่อวันที่เก็บเป็น VARCHAR ต้องแปลงเป็น DATE ก่อนเปรียบเทียบ ใช้ STR_TO_DATE()
สร้างตารางตัวอย่าง
mysql> create table DemoTable (
DueDate varchar(60) ) ;
Query OK, 0 rows affected (0.71 sec)
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable values('12-AUG-2016'); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('14-AUG-2018'); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('24-AUG-2012'); Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('14-AUG-2012'); Query OK, 1 row affected (0.19 sec)
แสดงข้อมูลทั้งหมด
mysql> select *from DemoTable;
+-------------+ | DueDate | +-------------+ | 12-AUG-2016 | | 14-AUG-2018 | | 24-AUG-2012 | | 14-AUG-2012 | +-------------+ 4 rows in set (0.00 sec)
คิวรี่ค้นหาวันที่ 14-AUG-2012
mysql> select *from DemoTable where str_to_date(DueDate,'%d-%M-%Y')=str_to_date('14-AUG-2012','%d-%M-%Y');
ผลลัพธ์:
+-------------+ | DueDate | +-------------+ | 14-AUG-2012 | +-------------+ 1 row in set (0.00 sec)
รูปแบบ Format Specifiers สำคัญ
| Specifier | ความหมาย | ตัวอย่าง |
|---|---|---|
%d | วัน (00-31) | 14 |
%M | ชื่อเดือนเต็ม | August |
%b | ชื่อเดือนย่อ | Aug |
%m | เดือน (00-12) | 08 |
%Y | ปี 4 หลัก | 2012 |
%y | ปี 2 หลัก | 12 |
ข้อควรระวัง
- ประสิทธิภาพ: ใช้ฟังก์ชันบนคอลัมน์ ทำให้ไม่ใช้ Index ได้
- แนวทางแก้: เพิ่มคอลัมน์ DATE แยก หรือ Generated Column (MySQL 5.7+)
ALTER TABLE DemoTable ADD DueDate_parsed DATE GENERATED ALWAYS AS (STR_TO_DATE(DueDate, '%d-%M-%Y')) STORED;
ฟังก์ชันที่เกี่ยวข้อง
DATE_FORMAT(date, format)- แปลง DATE เป็น VARCHARSTR_TO_DATE(str, format)- แปลง VARCHAR เป็น DATEGET_FORMAT()- ได้ format string สำหรับ locale ต่างๆ