ใช้ 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