ใช้ตัวดำเนินการเลขคณิตวันที่กับ INTERVAL เพื่อเลือกข้อมูลในช่วง 30 วันก่อนและหลังวันนี้
ไวยากรณ์
SELECT * FROM yourTableName WHERE yourDateColumn > NOW() - INTERVAL 30 DAY AND yourDateColumn < NOW() + INTERVAL 30 DAY;
สร้างตารางตัวอย่าง
mysql> CREATE TABLE selectDatesDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ArrivalDate DATETIME
-> );
เพิ่มข้อมูลตัวอย่าง
mysql> INSERT INTO selectDatesDemo(ArrivalDate) VALUES
('2019-01-10'), ('2019-01-29'), ('2019-02-13'), ('2019-02-19'),
('2018-02-13'), ('2018-03-13');
แสดงข้อมูลทั้งหมด (สมมติวันนี้ 2019-02-27)
mysql> SELECT * FROM selectDatesDemo;
ผลลัพธ์:
+----+---------------------+ | Id | ArrivalDate | +----+---------------------+ | 1 | 2019-01-10 00:00:00 | | 2 | 2019-01-29 00:00:00 | | 3 | 2019-02-13 00:00:00 | | 4 | 2019-02-19 00:00:00 | | 5 | 2018-02-13 00:00:00 | | 6 | 2018-03-13 00:00:00 | +----+---------------------+
Query ช่วง 30 วัน (2019-01-28 ถึง 2019-03-29)
mysql> SELECT * FROM selectDatesDemo
-> WHERE ArrivalDate > NOW() - INTERVAL 30 DAY
-> AND ArrivalDate < NOW() + INTERVAL 30 DAY;
ผลลัพธ์ (Id 3, 4):
+----+---------------------+ | Id | ArrivalDate | +----+---------------------+ | 3 | 2019-02-13 00:00:00 | | 4 | 2019-02-19 00:00:00 | +----+---------------------+
รูปแบบ INTERVAL อื่นๆ
| หน่วย | ตัวอย่าง |
|---|---|
| SECOND / SECONDS | INTERVAL 30 SECOND |
| MINUTE / MINUTES | INTERVAL 30 MINUTE |
| HOUR / HOURS | INTERVAL 2 HOUR |
| DAY / DAYS | INTERVAL 30 DAY |
| WEEK / WEEKS | INTERVAL 4 WEEK |
| MONTH / MONTHS | INTERVAL 6 MONTH |
| QUARTER / QUARTERS | INTERVAL 1 QUARTER |
| YEAR / YEARS | INTERVAL 1 YEAR |
รูปแบบช่วงที่พบบ่อย
- 7 วันย้อนหลัง:
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) - 30 วันย้อนหลัง:
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) - เดือนนี้:
WHERE date >= DATE_FORMAT(NOW(), '%Y-%m-01') - เดือนที่แล้ว:
WHERE date >= DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH) AND date < DATE_FORMAT(NOW(), '%Y-%m-01')
ประสิทธิภาพ: หลีกเลี่ยงฟังก์ชันบนคอลัมน์
-- ช้า: ไม่ใช้ index WHERE DATE(yourDateColumn) > NOW() - INTERVAL 30 DAY -- เร็ว: ใช้ index ได้ (SARGable) WHERE yourDateColumn > NOW() - INTERVAL 30 DAY AND yourDateColumn < NOW() + INTERVAL 30 DAY