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

MySQL: ดึงวันที่ใหม่กว่า 14 วันที่ผ่านมาด้วย DATE_SUB

การค้นหาข้อมูลวันที่ในช่วง 14 วันที่ผ่านมา (Recent 14 days)

ใช้ DATE_SUB(CURDATE(), INTERVAL 14 DAY) คำนวณวันที่ 14 วันที่แล้ว แล้วกรองวันที่มากกว่าค่านั้น

สร้างตารางและข้อมูล

mysql> create table DemoTable1392 (
    -> ArrivalDate date
    -> );
Query OK, 0 rows affected (0.43 sec)

mysql> insert into DemoTable1392 values('2019-09-10');
mysql> insert into DemoTable1392 values('2019-09-26');
mysql> insert into DemoTable1392 values('2019-09-12');
mysql> insert into DemoTable1392 values('2018-09-20');
mysql> insert into DemoTable1392 values('2019-10-11');

ข้อมูลและวันที่ปัจจุบัน

mysql> select * from DemoTable1392;
+-------------+
| ArrivalDate |
+-------------+
| 2019-09-10  |
| 2019-09-26  |
| 2019-09-12  |
| 2018-09-20  |
| 2019-10-11  |
+-------------+

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2019-09-26 |
+------------+

คำสั่ง WHERE ด้วย DATE_SUB

mysql> select * from DemoTable1392
    -> where ArrivalDate > date_sub(curdate(), interval 14 day);

ผลลัพธ์ (วันที่ > 2019-09-12)

+-------------+
| ArrivalDate |
+-------------+
| 2019-09-26  |
| 2019-10-11  |
+-------------+

การคำนวณ

  • CURDATE() = 2019-09-26
  • DATE_SUB(..., INTERVAL 14 DAY) = 2019-09-12
  • ArrivalDate > 2019-09-12 → 2019-09-26 และ 2019-10-11

รูปแบบอื่นที่เทียบเท่า

-- ใช้ DATE_ADD กับลบ
WHERE ArrivalDate > DATE_ADD(CURDATE(), INTERVAL -14 DAY)

-- ใช้ INTERVAL arithmetic (MySQL 8.0+)
WHERE ArrivalDate > CURDATE() - INTERVAL 14 DAY

-- รวมวันปัจจุบัน (>= แทน >)
WHERE ArrivalDate >= CURDATE() - INTERVAL 13 DAY

กรณี DATETIME (มีเวลา)

-- หา 14 วันที่ผ่านมา รวมเวลา
WHERE ArrivalDateTime >= DATE_SUB(NOW(), INTERVAL 14 DAY)

-- หรือ truncate เวลา
WHERE DATE(ArrivalDateTime) > DATE_SUB(CURDATE(), INTERVAL 14 DAY)

ประสิทธิภาพและ Index

  • คอลัมน์ DATE / DATETIME ที่มี Index — ใช้ Range Scan ได้เร็ว
  • หลีกเลี่ยง function บนคอลัมน์ (เช่น DATE(ArrivalDateTime)) เพราะจะไม่ใช้ index
  • ควรเก็บวันที่เป็น DATE หรือ DATETIME type ไม่ใช่ VARCHAR