สถานการณ์: กรองพนักงานตามวันที่เข้า-ออกงาน
ต้องการหาพนักงานที่:
- เข้า工作ก่อนวันที่ X (
joining_date < '2020-05-11') - AND (ออกงานหลังวันที่ Y
relieving_date > '2020-08-10'OR ยังไม่ได้ออกงานrelieving_date IS NULL)
ไวยากรณ์
SELECT * FROM yourTable WHERE date_col1 < value1 AND (date_col2 > value2 OR date_col2 IS NULL);
ตัวอย่าง: ตาราง demo35
CREATE TABLE demo35 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
joining_date DATE,
relieving_date DATE
);
INSERT INTO demo35 (joining_date, relieving_date) VALUES
('2020-01-10', '2020-07-11'),
('2020-05-07', '2020-12-08'),
('2020-04-11', '2020-09-18'),
('2020-03-12', '2020-10-01');
ข้อมูล
+----+--------------+----------------+ | id | joining_date | relieving_date | +----+--------------+----------------+ | 1 | 2020-01-10 | 2020-07-11 | | 2 | 2020-05-07 | 2020-12-08 | | 3 | 2020-04-11 | 2020-09-18 | | 4 | 2020-03-12 | 2020-10-01 | +----+--------------+----------------+
คำสั่ง Query
SELECT * FROM demo35 WHERE joining_date < '2020-05-11' AND (relieving_date > '2020-08-10' OR relieving_date IS NULL);
ผลลัพธ์ (id 2,3,4)
+----+--------------+----------------+ | id | joining_date | relieving_date | +----+--------------+----------------+ | 2 | 2020-05-07 | 2020-12-08 | | 3 | 2020-04-11 | 2020-09-18 | | 4 | 2020-03-12 | 2020-10-01 | +----+--------------+----------------+
id 1 ถูกตัดออก เพราะ relieving_date (2020-07-11) ไม่ > 2020-08-10
รูปแบบวันที่อื่นๆ
1. BETWEEN (รวมปลาย)
SELECT * FROM demo35 WHERE joining_date BETWEEN '2020-01-01' AND '2020-12-31';
2. ก่อนวันที่ (BEFORE)
SELECT * FROM demo35 WHERE joining_date < '2020-06-01';
3. หลังวันที่ (AFTER)
SELECT * FROM demo35 WHERE joining_date > '2020-06-01';
4. รวม NULL ในช่วง
SELECT * FROM demo35 WHERE (relieving_date BETWEEN '2020-01-01' AND '2020-12-31') OR relieving_date IS NULL;
เคล็ดลับประสิทธิภาพ
- สร้าง INDEX บนคอลัมน์วันที่ที่ใช้ WHERE บ่อย
- หลีกเลี่ยงฟังก์ชันบนคอลัมน์:
WHERE YEAR(joining_date) = 2020❌ - ใช้รูปแบบช่วง:
WHERE joining_date >= '2020-01-01' AND joining_date < '2021-01-01'✅