ภาพรวม
ใช้ INTERVAL ร่วมกับ DATE_SUB() หรือ NOW() - INTERVAL เพื่อคำนวณช่วงวันที่แบบ Relative
ไวยากรณ์
WHERE date_column BETWEEN DATE_SUB(NOW(), INTERVAL 90 DAY) AND NOW()
-- หรือ
WHERE date_column >= DATE_SUB(NOW(), INTERVAL 90 DAY)
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล
CREATE TABLE DemoTable (DueDate DATE);
INSERT INTO DemoTable VALUES ('2019-07-10');
INSERT INTO DemoTable VALUES ('2019-09-02');
INSERT INTO DemoTable VALUES ('2019-06-01');
INSERT INTO DemoTable VALUES ('2019-05-10');
INSERT INTO DemoTable VALUES ('2019-08-21');
2. ข้อมูลทั้งหมด
SELECT * FROM DemoTable;
+------------+
| DueDate |
+------------+
| 2019-07-10 |
| 2019-09-02 |
| 2019-06-01 |
| 2019-05-10 |
| 2019-08-21 |
+------------+
3. Query: วันที่ระหว่าง 90 วันที่แล้ว ถึง วันนี้
SELECT * FROM DemoTable
WHERE DueDate BETWEEN DATE_SUB(NOW(), INTERVAL 90 DAY) AND NOW();
4. ผลลัพธ์ (สมมติวันนี้คือ 2019-09-15)
+------------+
| DueDate |
+------------+
| 2019-07-10 |
| 2019-08-21 |
+------------+
รูปแบบ INTERVAL ต่างๆ
| หน่วย | ตัวอย่าง |
|---|---|
| MICROSECOND | INTERVAL 500 MICROSECOND |
| SECOND | INTERVAL 30 SECOND |
| MINUTE | INTERVAL 15 MINUTE |
| HOUR | INTERVAL 2 HOUR |
| DAY | INTERVAL 90 DAY |
| WEEK | INTERVAL 4 WEEK |
| MONTH | INTERVAL 3 MONTH |
| QUARTER | INTERVAL 1 QUARTER |
| YEAR | INTERVAL 1 YEAR |
รูปแบบ Query ที่ใช้บ่อย
7 วันที่แล้วถึงปัจจุบัน
WHERE CreatedAt >= DATE_SUB(NOW(), INTERVAL 7 DAY)
30 วันที่แล้วถึงปัจจุบัน
WHERE CreatedAt >= DATE_SUB(NOW(), INTERVAL 30 DAY)
เดือนนี้ (First day ถึง ตอนนี้)
WHERE CreatedAt >= DATE_FORMAT(NOW(), '%Y-%m-01')
เดือนที่แล้ว (ทั้งเดือน)
WHERE CreatedAt >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m-01')
AND CreatedAt < DATE_FORMAT(NOW(), '%Y-%m-01')
Year-to-Date (ต้นปีถึงปัจจุบัน)
WHERE CreatedAt >= DATE_FORMAT(NOW(), '%Y-01-01')
ประสิทธิภาพและ Index
- ใช้
DATE_SUB(NOW(), INTERVAL ...)ทางด้านขวา (Right side) → Index ใช้งานได้ - หลีกเลี่ยง Function บนคอลัมน์:
WHERE DATE(CreatedAt) >= ...(ไม่ใช้ Index) - Partitioning ตามวันที่ ช่วย Prune Partition ได้
สรุป
ใช้ BETWEEN DATE_SUB(NOW(), INTERVAL 90 DAY) AND NOW() หรือ >= DATE_SUB(NOW(), INTERVAL 90 DAY) เพื่อ Query ช่วงวันที่ Relative 90 วันย้อนหลัง