ภาพรวม
ใช้ 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 ได้ เขียนอ่านง่าย