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

Query ข้อมูลในช่วงวันที่ (Range) ด้วย BETWEEN ใน MySQL

ภาพรวม

ใช้ BETWEEN เพื่อเลือกข้อมูลที่อยู่ในช่วงวันที่ (Inclusive - รวมทั้งสองขอบ)

ไวยากรณ์

SELECT * FROM table_name
WHERE date_column BETWEEN start_date AND end_date;

ตัวอย่างสมบูรณ์

1. สร้างตารางและข้อมูล

CREATE TABLE DemoTable1422 (
    EmployeeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    EmployeeName VARCHAR(20),
    EmployeeJoiningDate DATE
);

INSERT INTO DemoTable1422 (EmployeeName, EmployeeJoiningDate) VALUES ('John', '2017-09-28');
INSERT INTO DemoTable1422 (EmployeeName, EmployeeJoiningDate) VALUES ('Chris', '2019-09-29');
INSERT INTO DemoTable1422 (EmployeeName, EmployeeJoiningDate) VALUES ('Bob', '2018-01-31');
INSERT INTO DemoTable1422 (EmployeeName, EmployeeJoiningDate) VALUES ('Sam', '2018-12-21');
INSERT INTO DemoTable1422 (EmployeeName, EmployeeJoiningDate) VALUES ('Mike', '2019-11-10');

2. ข้อมูลทั้งหมด

SELECT * FROM DemoTable1422;
+------------+--------------+---------------------+
| EmployeeId | EmployeeName | EmployeeJoiningDate |
+------------+--------------+---------------------+
| 1          | John         | 2017-09-28          |
| 2          | Chris        | 2019-09-29          |
| 3          | Bob          | 2018-01-31          |
| 4          | Sam          | 2018-12-21          |
| 5          | Mike         | 2019-11-10          |
+------------+--------------+---------------------+

3. Query: วันที่เข้าทำงานระหว่าง 2018-09-29 ถึง 2019-09-29

SELECT * FROM DemoTable1422
WHERE EmployeeJoiningDate BETWEEN '2018-09-29' AND '2019-09-29';

4. ผลลัพธ์

+------------+--------------+---------------------+
| EmployeeId | EmployeeName | EmployeeJoiningDate |
+------------+--------------+---------------------+
| 2          | Chris        | 2019-09-29          |
| 4          | Sam          | 2018-12-21          |
+------------+--------------+---------------------+

รายละเอียด BETWEEN

  • Inclusive: รวมทั้ง Start และ End Date
  • ทำงานกับ DATE, DATETIME, TIMESTAMP, NUMBER, STRING
  • เทียบเท่า: col >= start AND col <= end

รูปแบบวันที่ที่รองรับ

-- DATE: 'YYYY-MM-DD'
-- DATETIME: 'YYYY-MM-DD HH:MM:SS'
-- TIMESTAMP: 'YYYY-MM-DD HH:MM:SS'
-- Relative: DATE_SUB(NOW(), INTERVAL 30 DAY)

ตัวอย่างเพิ่มเติม

ช่วงเวลา (DATETIME)

SELECT * FROM Logs
WHERE LogTime BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59';

Relative: 30 วันที่แล้วถึงตอนนี้

SELECT * FROM Orders
WHERE OrderDate BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();

เดือนนี้

SELECT * FROM Sales
WHERE SaleDate >= DATE_FORMAT(NOW(), '%Y-%m-01')
  AND SaleDate < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 MONTH), '%Y-%m-01');

ประสิทธิภาพและ Index

  • BETWEEN บนคอลัมน์ Date/Datetime ใช้ Index ได้ (SARGable)
  • หลีกเลี่ยง Function บนคอลัมน์: WHERE DATE(col) BETWEEN ... (ไม่ใช้ Index)
  • Partitioning ตาม Date ช่วย Prune Partition ได้

สรุป

ใช้ WHERE date_col BETWEEN 'start' AND 'end' Query ช่วงวันที่ Inclusive ใช้ Index ได้ เขียนอ่านง่าย