ฟังก์ชัน TIMESTAMPDIFF()
คำนวณความต่างระหว่างสองวันที่/เวลาในหน่วยที่กำหนด (MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR) คืนค่าจำนวนเต็ม (Integer)
รูปแบบคำสั่ง
TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
คืนค่า: datetime_expr2 - datetime_expr1 ในหน่วย unit
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable (
-> Date1 DATE,
-> Date2 DATE
-> );
Query OK, 0 rows affected (1.04 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable VALUES('2017-01-10', '2017-12-10');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable VALUES('2018-12-31', '2015-01-02');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable VALUES('2020-03-01', '2019-06-15');
Query OK, 1 row affected (0.19 sec)
3. แสดงข้อมูล
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+------------+------------+ | Date1 | Date2 | +------------+------------+ | 2017-01-10 | 2017-12-10 | | 2018-12-31 | 2015-01-02 | | 2020-03-01 | 2019-06-15 | +------------+------------+ 3 rows in set (0.00 sec)
4. หาความต่างเป็นเดือน (ใช้ ABS เพื่อค่าสัมบูรณ์)
mysql> SELECT ABS(TIMESTAMPDIFF(MONTH, Date1, Date2)) FROM DemoTable;
ผลลัพธ์:
+---------------------------------------+ | abs(timestampdiff(MONTH,Date1,Date2)) | +---------------------------------------+ | 11 | | 47 | | 8 | +---------------------------------------+ 3 rows in set (0.03 sec)
อธิบายผลลัพธ์
| Date1 | Date2 | ความต่าง (เดือน) | คำนวณ |
|---|---|---|---|
| 2017-01-10 | 2017-12-10 | 11 | Jan → Dec = 11 เดือน |
| 2018-12-31 | 2015-01-02 | 47 | 2015-01 → 2018-12 = 3 ปี 11 เดือน = 47 เดือน |
| 2020-03-01 | 2019-06-15 | 8 | 2019-06 → 2020-03 = 8 เดือน |
ฟังก์ชันเปรียบเทียบ
| ฟังก์ชัน | คืนค่า | เหมาะสำหรับ |
|---|---|---|
| TIMESTAMPDIFF() | Integer (จำนวนเต็ม) | อายุ, ระยะเวลาในหน่วยที่ชัดเจน |
| DATEDIFF() | Integer (วัน) | ความต่างเป็นวันอย่างเดียว |
| TIMEDIFF() | TIME (HH:MM:SS) | ความต่างเวลาในวันเดียวกัน |
| PERIOD_DIFF() | Integer (เดือน) | รูปแบบ YYYYMM หรือ YYMM |
กรณีการใช้งานจริง
- คำนวณอายุพนักงาน/ลูกค้า (YEAR)
- คำนวณระยะเวลาสัญญา/เช่า (MONTH)
- คำนวณวันค้างชำระ (DAY)
- รายงานรายเดือน/รายไตรมาส (QUARTER)
- SLA Monitoring (HOUR, MINUTE)
ข้อควรระวัง
- ลำดับ Argument:
TIMESTAMPDIFF(unit, start, end)→ end - start - ผลลัพธ์เป็น Integer (ปัดทิ้งเศษ) ไม่ใช่ทศนิยม
- ใช้ ABS() หากต้องการค่าสัมบูรณ์ (ไม่สนใจว่าวันไหนมาก่อน)
- DATE Type จะถูกแปลงเป็น DATETIME 00:00:00 อัตโนมัติ