Hàm TIMEDIFF() và TIME_FORMAT()
TIMEDIFF(end, start) trả về INTERVAL (có thể âm). TIME_FORMAT() định dạng hiển thị.
Ví dụ
Tạo bảng chấm công:
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');
Tính chênh lệch (PunchIn - PunchOut = âm vì In sớm hơn Out):
SELECT TIME_FORMAT(TIMEDIFF(PunchIn, PunchOut), '%H hrs, %i min.') AS diff
FROM DemoTable624;
Kết quả:
+---------------------------+
| diff |
+---------------------------+
| -00 hrs, 40 min. |
| -00 hrs, 30 min. |
+---------------------------+
Sửa dấu (muốn dương: Out - In)
SELECT TIME_FORMAT(TIMEDIFF(PunchOut, PunchIn), '%H hrs, %i min.') AS duration
FROM DemoTable624;
Kết quả: 00 hrs, 40 min. và 00 hrs, 30 min.
Các format specifier cho TIME
| Specifier | Ý nghĩa |
|---|---|
| %H | Giờ (00-23) |
| %h | Giờ (01-12) |
| %i | Phút (00-59) |
| %s | Giây (00-59) |
| %f | Microseconds (000000-999999) |
| %p | AM/PM |
Tính tổng giờ làm việc (SUM)
Không thể SUM trực tiếp TIME. Cách làm:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(PunchOut, PunchIn)))) AS total_work
FROM DemoTable624;
Lưu ý
TIMEDIFFtrả về TIME type (range: -838:59:59 đến 838:59:59). Vượt quá → NULL.- Dùng
TIMESTAMPDIFF(SECOND, start, end)cho khoảng cách lớn (ngày/giờ). - Index trên cột datetime không giúp cho TIMEDIFF trong SELECT (chỉ giúp WHERE).