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

SELECT ช่วงวันที่ 30 วันใน MySQL ใช้ INTERVAL

ใช้ตัวดำเนินการเลขคณิตวันที่กับ 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 / SECONDSINTERVAL 30 SECOND
MINUTE / MINUTESINTERVAL 30 MINUTE
HOUR / HOURSINTERVAL 2 HOUR
DAY / DAYSINTERVAL 30 DAY
WEEK / WEEKSINTERVAL 4 WEEK
MONTH / MONTHSINTERVAL 6 MONTH
QUARTER / QUARTERSINTERVAL 1 QUARTER
YEAR / YEARSINTERVAL 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