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

เลือกแถวที่วันที่อยู่ระหว่าง 90 วันที่แล้วจนถึงปัจจุบันใน MySQL

ภาพรวม

ใช้ 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 ต่างๆ

หน่วยตัวอย่าง
MICROSECONDINTERVAL 500 MICROSECOND
SECONDINTERVAL 30 SECOND
MINUTEINTERVAL 15 MINUTE
HOURINTERVAL 2 HOUR
DAYINTERVAL 90 DAY
WEEKINTERVAL 4 WEEK
MONTHINTERVAL 3 MONTH
QUARTERINTERVAL 1 QUARTER
YEARINTERVAL 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 วันย้อนหลัง