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

MySQL คำนวณ Time Difference ระหว่างสองคอลัมน์ DATETIME

ใช้ TIMEDIFF() และ TIME_FORMAT() คำนวณช่วงเวลา

TIMEDIFF(end, start) คืนค่า TIME (HH:MM:SS) ความต่างระหว่างสอง Datetime/Time

ตัวอย่าง: Punch In / Punch Out

CREATE TABLE DemoTable624 (
    PunchIn DATETIME,
    PunchOut DATETIME
);

INSERT INTO DemoTable624 VALUES
('2019-07-14 12:10:00', '2019-07-14 12:50:00'),
('2019-07-14 11:00:00', '2019-07-14 11:30:00');

Query: คำนวณระยะเวลา Format ชั่วโมง:นาที

SELECT 
    TIME_FORMAT(TIMEDIFF(PunchOut, PunchIn), '%H hrs, %i min.') AS duration
FROM DemoTable624;

ผลลัพธ์:

+-------------------+
| duration          |
+-------------------+
| 00 hrs, 40 min.   |
| 00 hrs, 30 min.   |
+-------------------+

⚠️ หมายเหตุ: ลำดับ Argument

TIMEDIFF(end, start) = end - start

บทความต้นฉบับใช้ TIMEDIFF(PunchIn, PunchOut) ได้ค่าลบ (-00 hrs, 40 min.)

Time Format Specifiers

Specifierความหมายตัวอย่าง
%Hชั่วโมง 00-2300
%h/%Iชั่วโมง 01-1212
%iนาที 00-5940
%sวินาที 00-5900
%fไมโครวินาที 000000-999999000000
%pAM/PMPM

คำนวณเป็น Minutes/Seconds ทั้งหมด

-- ทั้งหมดเป็นนาที
SELECT TIMESTAMPDIFF(MINUTE, PunchIn, PunchOut) AS minutes
FROM DemoTable624;
-- 40, 30

-- ทั้งหมดเป็นวินาที
SELECT TIMESTAMPDIFF(SECOND, PunchIn, PunchOut) AS seconds
FROM DemoTable624;
-- 2400, 1800

TIMESTAMPDIFF vs TIMEDIFF

FunctionReturn TypeUnit Controlใช้เมื่อไหร่
TIMEDIFFTIME (HH:MM:SS)FixedFormat แสดงผล
TIMESTAMPDIFFINTEGERYEAR/MONTH/DAY/HOUR/MINUTE/SECONDคำนวณ/Filter/Group By

กรณีข้ามวัน (Overnight Shift)

INSERT INTO DemoTable624 VALUES
('2019-07-14 22:00:00', '2019-07-15 06:00:00');

-- TIMEDIFF ยังทำงานถูกต้อง (8 hours)
SELECT TIME_FORMAT(TIMEDIFF(PunchOut, PunchIn), '%H hrs, %i min.') 
FROM DemoTable624 WHERE PunchIn = '2019-07-14 22:00:00';
-- 08 hrs, 00 min.

Working Hours Calculation (Business Hours Only) - Advanced

-- ต้องใช้ Stored Procedure หรือ Application Logic
-- SQL มันยากมากสำหรับ Exclude Weekend/Holiday/Lunch Break