ใช้ 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)