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

เลือกแถวโดยลบวันที่ใน WHERE clause ของ MySQL

ใช้ TIMESTAMPDIFF() คำนวณความต่าง

ฟังก์ชัน TIMESTAMPDIFF(unit, datetime1, datetime2) คืนค่าความต่างในหน่วยที่ระบุ

ไวยากรณ์

TIMESTAMPDIFF(unit, start_datetime, end_datetime)

unit: MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR

ตัวอย่าง: หาแถวที่เวลาอยู่ในช่วง 5 นาทีจากเวลาอ้างอิง

CREATE TABLE demo42 (start_date DATETIME);

INSERT INTO demo42 VALUES
('2020-01-10 12:30:05'),
('2019-02-24 10:40:45'),
('2020-05-12 05:45:55'),
('2020-05-12 05:40:55'),
('2020-05-12 05:42:55');

คำสั่ง SELECT

SELECT * FROM demo42
WHERE ABS(TIMESTAMPDIFF(MINUTE, start_date, '2020-05-12 05:40:55')) < 5;

ผลลัพธ์: แถวที่ต่างกันไม่เกิน 5 นาที

+---------------------+
| start_date          |
+---------------------+
| 2020-05-12 05:40:55 |
| 2020-05-12 05:42:55 |
+---------------------+

คำอธิบาย

  • TIMESTAMPDIFF(MINUTE, start_date, '2020-05-12 05:40:55') คำนวณความต่างเป็นนาที
  • ABS() 取ค่าสัมบูรณ์ (บวกเสมอ) เพื่อครอบคลุมทั้งก่อนและหลังเวลาอ้างอิง
  • < 5 เลือกเฉพาะที่ต่างกันน้อยกว่า 5 นาที

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

1. หาข้อมูลล่าสุด 7 วัน

SELECT * FROM orders
WHERE order_date >= DATE_SUB(NOW(), INTERVAL 7 DAY);

2. หาพนักงานอายุมากกว่า 30 ปี

SELECT * FROM employees
WHERE TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) > 30;

3. หาคำสั่งซื้อที่จัดส่งล่าช้ามากกว่า 2 วัน

SELECT * FROM shipments
WHERE TIMESTAMPDIFF(DAY, order_date, ship_date) > 2;

ประสิทธิภาพ: หลีกเลี่ยงฟังก์ชันบนคอลัมน์

แทนที่จะใช้ WHERE TIMESTAMPDIFF(DAY, created_at, NOW()) < 30 ให้ใช้:

WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)

เพื่อให้ใช้ INDEX ได้ (SARGable)