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

การเปรียบเทียบวันที่เมื่อ AdmissionDate น้อยกว่าวันปัจจุบันใน MySQL

เมื่อวันที่เก็บเป็น VARCHAR ต้องแปลงด้วย STR_TO_DATE() ก่อนเปรียบเทียบกับ CURDATE()

สร้างตารางตัวอย่าง

mysql> create table DemoTable ( 
    AdmissionDate varchar(50) ); 
Query OK, 0 rows affected (0.63 sec)

หมายเหตุ: สมมติวันนี้คือ 14-Sep-2019

เพิ่มข้อมูลตัวอย่าง

mysql> insert into DemoTable values('15-Sep-2019'); Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('14-Sep-2019'); Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('13-Sep-2016'); Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('13-Sep-2019'); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('13-Sep-2020'); Query OK, 1 row affected (0.10 sec)

แสดงข้อมูลทั้งหมด

mysql> select *from DemoTable;
+---------------+
| AdmissionDate |
+---------------+
| 15-Sep-2019   |
| 14-Sep-2019   |
| 13-Sep-2016   |
| 13-Sep-2019   |
| 13-Sep-2020   |
+---------------+
5 rows in set (0.00 sec)

คิวรี่เปรียบเทียบวันที่น้อยกว่าวันปัจจุบัน

mysql> select *from DemoTable where str_to_date(AdmissionDate,'%d-%b-%Y') < CURDATE();

ผลลัพธ์ (วันที่ก่อน 14-Sep-2019):

+---------------+
| AdmissionDate |
+---------------+
| 13-Sep-2016   |
| 13-Sep-2019   |
+---------------+
2 rows in set (0.00 sec)

คำอธิบาย Format Specifier

  • %d - วัน (01-31)
  • %b - ชื่อเดือนย่อ 3 ตัว (Jan, Feb, Mar, ..., Sep)
  • %Y - ปี 4 หลัก

กรณีวันที่เป็นชนิด DATE แล้ว

-- ไม่ต้องแปลง
WHERE AdmissionDate < CURDATE()

-- หรือใช้ DATE() หากเป็น DATETIME
WHERE DATE(AdmissionDate) < CURDATE()

ประสิทธิภาพ

การใช้ STR_TO_DATE() บนคอลัมน์จะทำให้ Full Table Scan ควรพิจารณา:

  • เปลี่ยนชนิดคอลัมน์เป็น DATE
  • เพิ่ม Generated Column: ADD admission_date_parsed DATE GENERATED ALWAYS AS (STR_TO_DATE(AdmissionDate, '%d-%b-%Y')) STORED
  • เพิ่ม Index ให้ Generated Column