Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tổng cộng các giá trị TIME hoặc VARCHAR thời gian trong MySQL

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

  1. TIME_TO_SEC(DueTime): Chuyển mỗi giá trị TIME thành tổng số giây (VD: '00:08:00' → 480).
  2. SUM(...): Cộng dồn tất cả số giây.
  3. 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 TIME trong MySQL范围: -838:59:59 đến 838: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;