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

คำนวณความต่างเวลาใน MySQL ด้วย INTERVAL และ NOW()


สถานการณ์

มีตารางเก็บ ArrivalTime (DATETIME) ต้องการหาแถวที่ ArrivalTime อยู่ในช่วง 5 ชั่วโมงย้อนหลังจากเวลาปัจจุบัน

วิธีแก้: ใช้ Date Arithmetic กับ INTERVAL

MySQL รองรับการคำนวณ Date/Time โดยตรง: NOW() - INTERVAL 5 HOUR

ตัวอย่างการใช้งาน

1. สร้างตาราง

mysql> CREATE TABLE DemoTable1570 (
    -> ArrivalTime DATETIME
    -> );
Query OK, 0 rows affected (0.87 sec)

2. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable1570 VALUES('2019-10-15 5:10:00');
Query OK, 1 row affected (0.25 sec)
mysql> INSERT INTO DemoTable1570 VALUES('2019-10-15 23:00:00');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable1570 VALUES('2019-10-15 23:10:00');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable1570 VALUES('2019-10-15 16:10:00');
Query OK, 1 row affected (0.15 sec)

3. เวลาปัจจุบัน (สมมติ)

mysql> SELECT NOW();
+---------------------+
| now()               |
+---------------------+
| 2019-10-15 22:26:14 |
+---------------------+

4. หาแถวที่ ArrivalTime อยู่ใน 5 ชั่วโมงล่าสุด

mysql> SELECT * FROM DemoTable1570
    -> WHERE ArrivalTime > NOW() - INTERVAL 5 HOUR;

ผลลัพธ์ (22:26 - 5 ชม. = 17:26 → เหลือ 23:00 และ 23:10):

+---------------------+
| ArrivalTime         |
+---------------------+
| 2019-10-15 23:00:00 |
| 2019-10-15 23:10:00 |
+---------------------+
2 rows in set (0.00 sec)

รูปแบบ INTERVAL ทั้งหมด

Unit ตัวอย่าง
MICROSECOND INTERVAL 500 MICROSECOND
SECOND INTERVAL 30 SECOND
MINUTE INTERVAL 15 MINUTE
HOUR INTERVAL 5 HOUR
DAY INTERVAL 7 DAY
WEEK INTERVAL 2 WEEK
MONTH INTERVAL 3 MONTH
QUARTER INTERVAL 1 QUARTER
YEAR INTERVAL 1 YEAR
COMBINED INTERVAL '1 12:30:00' DAY_SECOND

ฟังก์ชันเกี่ยวข้อง

  • DATE_ADD(date, INTERVAL expr unit) - บวก
  • DATE_SUB(date, INTERVAL expr unit) - ลบ
  • ADDDATE(date, INTERVAL expr unit) - Alias ของ DATE_ADD
  • SUBDATE(date, INTERVAL expr unit) - Alias ของ DATE_SUB

Performance & Index

  • WHERE ArrivalTime > NOW() - INTERVAL 5 HOUR → ใช้ Index บน ArrivalTime ได้ (Sargable)
  • หลีกเลี่ยง Function บน Column: WHERE DATE(ArrivalTime) = CURDATE() → ไม่ใช้ Index
  • แทนด้วย: WHERE ArrivalTime >= CURDATE() AND ArrivalTime < CURDATE() + INTERVAL 1 DAY

กรณีการใช้งานจริง

  • Real-time Dashboard: แสดงข้อมูล 1 ชั่วโมง/24 ชั่วโมงล่าสุด
  • Alert/Notification: ตรวจสอบ Event ที่เกิดขึ้นไม่เกิน 5 นาที
  • Session Management: หา Session ที่ Active ใน 30 นาทีล่าสุด
  • Log Analysis: Query Error Log 1 ชั่วโมงย้อนหลัง