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

Query MySQL ดึงข้อมูลก่อน 3 วันล่าสุด (Relative Date)

ใช้ DATE_SUB() และ NOW() หรือวันที่อ้างอิง เพื่อคำนวณช่วงวันที่แบบ Relative

ตัวอย่างสถานการณ์

สมมติวันนี้คือ 2019-10-20 ต้องการข้อมูลที่โพสต์ก่อน 3 วันล่าสุด (คือ ก่อน 2019-10-17)

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

mysql> create table DemoTable1582 (
    -> PostedDate datetime
    -> );
Query OK, 0 rows affected (13.36 sec)
mysql> insert into DemoTable1582 values('2019-01-21 12:34:40');
Query OK, 1 row affected (1.06 sec)
mysql> insert into DemoTable1582 values('2019-10-15 11:00:00');
Query OK, 1 row affected (0.87 sec)
mysql> insert into DemoTable1582 values('2019-10-25 1:10:00');
Query OK, 1 row affected (1.14 sec)

ดูข้อมูลทั้งหมด:

mysql> select * from DemoTable1582;
+---------------------+
| PostedDate          |
+---------------------+
| 2019-01-21 12:34:40 |
| 2019-10-15 11:00:00 |
| 2019-10-25 01:10:00 |
+---------------------+
3 rows in set (0.00 sec)

คิวรีดึงข้อมูลก่อน 3 วัน (แก้ไขจากตัวอย่างเดิม)

ตัวอย่างเดิมมี Logic ผิด ใช้ BETWEEN DATE_SUB(PostedDate, INTERVAL 3 DAY) AND NOW() ซึ่งไม่ได้เป็น "ก่อน 3 วันล่าสุด"

วิธีที่ถูกต้อง: ใช้วันที่อ้างอิงคงที่ (Anchor date) หรือ NOW():

-- ถ้าอ้างอิงจากวันนี้ (2019-10-20)
mysql> select * from DemoTable1582 
    -> where PostedDate < DATE_SUB('2019-10-20', INTERVAL 3 DAY);

หรือใช้ NOW() สำหรับระบบจริง:

mysql> select * from DemoTable1582 
    -> where PostedDate < DATE_SUB(NOW(), INTERVAL 3 DAY);

ผลลัพธ์ที่คาดหวัง (วันที่ < 2019-10-17):

+---------------------+
| PostedDate          |
+---------------------+
| 2019-01-21 12:34:40 |
| 2019-10-15 11:00:00 |
+---------------------+
2 rows in set

คำอธิบาย

  • DATE_SUB(date, INTERVAL n DAY): ลบวันจากวันที่กำหนด
  • ใช้ < (น้อยกว่า) เพื่อหา "ก่อน" วันที่เกณฑ์
  • ใน Production ควรใช้ NOW() หรือวันที่จาก Application layer