ฟังก์ชัน TIMESTAMPDIFF() ใน MySQL คำนวณความต่างระหว่างสอง Datetime/Timestamp ในหน่วยที่ระบุ (MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR)
รูปแบบคำสั่ง
TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
-- คืนค่า: datetime_expr2 - datetime_expr1 (ในหน่วย unit)
ตัวอย่าง: หาความต่างเป็นชั่วโมง
1. สร้างตาราง Start/End DateTime
mysql> CREATE TABLE DifferenceInHours (
-> StartDateTime DATETIME,
-> EndDateTime DATETIME
-> );
Query OK, 0 rows affected (0.59 sec)
mysql> INSERT INTO DifferenceInHours VALUES
-> ('2018-12-20 10:00:00', '2018-12-19 12:00:00'),
-> ('2018-12-20 11:00:00', '2018-12-19 11:00:00'),
-> ('2018-12-20 10:30:00', '2018-12-19 11:00:00');
2. ดูข้อมูล
mysql> SELECT * FROM DifferenceInHours;
+---------------------+---------------------+
| StartDateTime | EndDateTime |
+---------------------+---------------------+
| 2018-12-20 10:00:00 | 2018-12-19 12:00:00 |
| 2018-12-20 11:00:00 | 2018-12-19 11:00:00 |
| 2018-12-20 10:30:00 | 2018-12-19 11:00:00 |
+---------------------+---------------------+
3 rows in set (0.00 sec)
3. คำนวณความต่างเป็นชั่วโมง (ใช้ ABS เพื่อค่าสัมบูรณ์)
mysql> SELECT ABS(TIMESTAMPDIFF(HOUR, StartDateTime, EndDateTime)) AS Hour
-> FROM DifferenceInHours;
+------+
| Hour |
+------+
| 22 |
| 24 |
| 23 |
+------+
3 rows in set (0.00 sec)
หน่วยเวลา (Unit) ที่รองรับ
| Unit | คำอธิบาย |
MICROSECOND | ไมโครวินาที |
SECOND | วินาที |
MINUTE | นาที |
HOUR | ชั่วโมง |
DAY | วัน |
WEEK | สัปดาห์ |
MONTH | เดือน |
QUARTER | ไตรมาส |
YEAR | ปี |
TIMESTAMPDIFF vs DATEDIFF vs TIMEDIFF
| ฟังก์ชัน | คืนค่า | หน่วย | รองรับ Timezone |
TIMESTAMPDIFF(unit, dt1, dt2) | Integer | ระบุได้ (YEAR..MICROSECOND) | ✅ ใช่ (TIMESTAMP) |
DATEDIFF(dt1, dt2) | Integer | วัน (dt1 - dt2) | ❌ ไม่ (DATE only) |
TIMEDIFF(dt1, dt2) | TIME | เวลา (HH:MM:SS) | ❌ ไม่ |
TIMESTAMPDIFF(SECOND, dt1, dt2) | Integer | วินาที | ✅ ใช่ |
ตัวอย่างเพิ่มเติม
อายุ (ปี) จากวันเกิด
SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM users;
ระยะเวลาทำงาน (นาที)
SELECT TIMESTAMPDIFF(MINUTE, clock_in, clock_out) AS work_minutes FROM attendance;
คำนวณค่าเช่า/ค่าจอดรถ (ชั่วโมง ปัดขึ้น)
SELECT CEIL(TIMESTAMPDIFF(MINUTE, start_time, end_time) / 60.0) AS hours_charged
FROM parking_log;
ข้อควรระวัง
- ลำดับอาร์กิวเมนต์:
TIMESTAMPDIFF(unit, earlier, later) → คืนค่าบวก
- หากสลับกัน จะได้ค่าติดลบ → ใช้
ABS() หากต้องการค่าสัมบูรณ์
TIMESTAMP คำนวณใน UTC (Session Timezone) ส่วน DATETIME คำนวณตรงตัว
- ประสิทธิภาพ: ดีมาก ใช้ Index ได้หากมี Index บนคอลัมน์ Datetime