MySQL không thể dùng SUM() trực tiếp trên kiểu TIME hoặc chuỗi thời gian VARCHAR. Giải pháp: chuyển đổi sang giây (TIME_TO_SEC()), cộng dồn, rồi chuyển ngược lại (SEC_TO_TIME()).
Ví dụ minh họa
Tạo bảng thời gian:
mysql> CREATE TABLE DemoTable1442 (
DueTime TIME
);
Chèn dữ liệu:
mysql> INSERT INTO DemoTable1442 VALUES ('00:08:00');
mysql> INSERT INTO DemoTable1442 VALUES ('00:04:00');
mysql> INSERT INTO DemoTable1442 VALUES ('12:55:00');
Dữ liệu:
mysql> SELECT * FROM DemoTable1442;
+----------+ | DueTime | +----------+ | 00:08:00 | | 00:04:00 | | 12:55:00 | +----------+
Tổng cộng thời gian
mysql> SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(DueTime))) AS TotalTime
FROM DemoTable1442;
Kết quả (13 giờ 7 phút):
+-----------+ | TotalTime | +-----------+ | 13:07:00 | +-----------+
Giải thích quy trình
TIME_TO_SEC(DueTime): Chuyển mỗi giá trị TIME thành tổng số giây (VD: '00:08:00' → 480).SUM(...): Cộng dồn tất cả số giây.SEC_TO_TIME(...): Chuyển tổng giây ngược lại thành định dạng TIME (HH:MM:SS).
Áp dụng cho VARCHAR lưu thời gian
Nếu cột là VARCHAR (VD: '08:30', '1:15:00'), cần ép kiểu trước:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(CAST(time_str AS TIME)))) FROM table_name;
Lưu ý quan trọng
- Kiểu
TIMEtrong MySQL范围:-838:59:59đến838:59:59. Tổng lớn hơn sẽ bị cắt ngấn. - Nếu tổng có thể vượt quá 838 giờ, hãy lưu tổng giây (BIGINT) hoặc chuyển sang ngày/giờ tự định dạng.
- Để format hiển thị đẹp:
TIME_FORMAT(SEC_TO_TIME(total_sec), '%H:%i:%s').
Ví dụ thực tế: Tính tổng giờ làm việc
SELECT
EmployeeId,
SEC_TO_TIME(SUM(TIME_TO_SEC(WorkHours))) AS TotalWorkTime
FROM Timesheet
WHERE WorkDate BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY EmployeeId;