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

เลือกข้อมูลตามช่วงวันที่แบบมีเงื่อนไขใน MySQL (BETWEEN/BEFORE/AFTER)

สถานการณ์: กรองพนักงานตามวันที่เข้า-ออกงาน

ต้องการหาพนักงานที่:

  • เข้า工作ก่อนวันที่ 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' ✅