การ Query ข้อมูลในช่วงวันที่ด้วยการเปรียบเทียบ Date
ใช้ตัวดำเนินการเปรียบเทียบ >= และ <= (หรือ BETWEEN) กับคอลัมน์ชนิด DATE หรือ DATETIME
รูปแบบคำสั่ง
SELECT * FROM table_name
WHERE date_column >= 'start_date' AND date_column <= 'end_date';
ตัวอย่าง: ดึงวันที่ระหว่าง 2019-06-01 ถึง 2019-08-31
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable (AdmissionDate DATE);
INSERT INTO DemoTable VALUES ('2019-08-31'), ('2019-09-01'), ('2019-05-10'), ('2019-06-12');
2. ดูข้อมูลทั้งหมด
SELECT * FROM DemoTable;
ผลลัพธ์:
+---------------+
| AdmissionDate |
+---------------+
| 2019-08-31 |
| 2019-09-01 |
| 2019-05-10 |
| 2019-06-12 |
+---------------+
3. Query ช่วงวันที่
SELECT * FROM DemoTable
WHERE AdmissionDate >= '2019-06-01' AND AdmissionDate <= '2019-08-31';
ผลลัพธ์:
+---------------+
| AdmissionDate |
+---------------+
| 2019-08-31 |
| 2019-06-12 |
+---------------+
ใช้ BETWEEN (เทียบเท่า)
SELECT * FROM DemoTable
WHERE AdmissionDate BETWEEN '2019-06-01' AND '2019-08-31';
ข้อควรระวังกับ DATETIME/TIMESTAMP
หากคอลัมน์เป็น DATETIME หรือ TIMESTAMP:
-- BETWEEN อาจพลาดเวลา
WHERE CreatedAt BETWEEN '2024-01-01' AND '2024-01-31'
-- จับได้แค่ 2024-01-31 00:00:00 (เวลา 00:00:00)
-- แก้ด้วย AND
WHERE CreatedAt >= '2024-01-01' AND CreatedAt < '2024-02-01'
-- จับได้ครบวัน 31 มกราคม จนถึง 23:59:59.999999
ฟังก์ชันวันที่ที่เกี่ยวข้อง
| ฟังก์ชัน | คำอธิบาย |
|---|---|
DATE(col) | ดึงส่วนวันที่จาก DATETIME |
YEAR(col), MONTH(col), DAY(col) | ดึงปี/เดือน/วัน |
DATE_ADD(date, INTERVAL n UNIT) | บวกช่วงเวลา |
DATE_SUB(date, INTERVAL n UNIT) | ลบช่วงเวลา |
DATEDIFF(date1, date2) | หาความต่างวัน |
NOW(), CURDATE(), CURTIME() | วันที่/เวลาปัจจุบัน |
ตัวอย่าง: 7 วันที่ผ่านมา
SELECT * FROM Orders
WHERE OrderDate >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
Index และประสิทธิภาพ
- สร้าง Index บนคอลัมน์ Date:
CREATE INDEX idx_date ON DemoTable(AdmissionDate) - Range Query (
>=,<=,BETWEEN) ใช้ Index ได้ดี - หลีกเลี่ยง Function บนคอลัมน์:
WHERE DATE(CreatedAt) = '2024-01-01'→ ไม่ใช้ Index