ใช้ STR_TO_DATE() แปลง VARCHAR เป็น DATE แล้วค่อยใช้ BETWEEN
ไวยากรณ์
SELECT * FROM yourTableName
WHERE STR_TO_DATE(LEFT(yourColumnName, LOCATE(' ', yourColumnName)), '%m/%d/%Y')
BETWEEN 'startDate' AND 'endDate';
ตัวอย่างการใช้งาน
สร้างตาราง (เก็บวันที่เป็น VARCHAR รูปแบบ MM/DD/YYYY HH:MI AM/PM):
mysql> create table SearchDateAsVarchar (
-> Id int NOT NULL AUTO_INCREMENT,
-> ShippingDate varchar(100),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.99 sec)
เพิ่มข้อมูล:
mysql> INSERT INTO SearchDateAsVarchar(ShippingDate) VALUES ('6/28/2011 9:58 AM');
mysql> INSERT INTO SearchDateAsVarchar(ShippingDate) VALUES ('6/18/2011 10:50:39 AM');
mysql> INSERT INTO SearchDateAsVarchar(ShippingDate) VALUES ('6/22/2011 11:45:40 AM');
ข้อมูล:
+----+-----------------------+ | Id | ShippingDate | +----+-----------------------+ | 1 | 6/28/2011 9:58 AM | | 2 | 6/18/2011 10:50:39 AM | | 3 | 6/22/2011 11:45:40 AM | +----+-----------------------+
ค้นหาช่วง 2011-06-20 ถึง 2011-06-28:
mysql> SELECT * FROM SearchDateAsVarchar
-> WHERE STR_TO_DATE(LEFT(ShippingDate, LOCATE(' ', ShippingDate)), '%m/%d/%Y')
-> BETWEEN '2011-06-20' AND '2011-06-28';
ผลลัพธ์:
+----+-----------------------+ | Id | ShippingDate | +----+-----------------------+ | 1 | 6/28/2011 9:58 AM | | 3 | 6/22/2011 11:45:40 AM | +----+-----------------------+
แนะนำ: ควรเก็บวันที่ในชนิด DATE/DATETIME/TIMESTAMP แทน VARCHAR เพื่อประสิทธิภาพและความถูกต้อง