Como sumar horas desde MYSQL
El tratado de fechas y horas desde PHP en ocasiones nos puede dar más de un dolor de cabeza. PHP dispone de muchas funciones para tratar las fechas y horas pero especialmente he visto bastante complicado poder sumar horas.
El caso particular del que vamos hablar, tenemos una tabla de la base de datos que guarda los tiempos (representados en horas) de realización de una tarea tal como podemos observar en la siguiente imagen:
Fíjate bien en el campo time de tipo TIME que tenemos en nustra tabla de tareas. En el se guardan el tiempo que se ha tardado en realizar la tarea. Para llevar un control de horas por usuario o fecha necesitamos hacer una suma de los tiempos.
Supongo que se puede hacer desde PHP pero en este artículo vamos a ver como hacerlo con MYSQL, ya que es realmente sencillo. Tan solo debemos ejecutar la siguiente sentencia:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time))) AS hours FROM task_time
Desde PHP sería llamar a esta query desde las típicas sentencias para conseguir valores de la base de datos.
$query = 'SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time))) AS hours FROM task_time';
Grasias mil, Luis Moreno, y todos
para mi caso
ya tenia calculado la diferencia de horas en el campo duration
select sec_to_time( sum( time_to_sec( duration ) ) ) from datasec
Saludos
Cúcuta – Norte de Santander – Colombia
Paso por aquí muchos años después, pero justo ahora las respuestas aquí me ayudaron mucho, así que dejo la solución que me funcionó para poder hacer cálculos con horas de diferentes tablas que preguntaba Diego:
SELECT TIMEDIFF(TIMEDIFF(classes.end_time, classes.start_time),
SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(rests.end_time, rests.start_time)))))
AS total_class_duration
FROM classes INNER JOIN rests
ON rests.classes_id_class = classes.id_class
WHERE classes.id_class=1;
Gracias por tu aportación Luis. Saludos
Si la quieren hacer con dos campos: hora_Inicio y hora_Final (sacar la diferencia y sumar esas diferencias con filtro de fecha)
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(SUBTIME(hora_finalizacion, hora_inicio)))) FROM cupos_rastras WHERE tipo_transporte=1 AND fecha>=’2022-04-04′ AND fecha<='2022-04-05';
y ya les da el total de la suma horas y minutos de esos dos campos
Hermanos me han salvado del dolor de cabeza de muchos dias, mil gracias!!!!!!
SELECT tareas.id,DATE_FORMAT(`fecha_t`, ‘%d %M %Y’) AS fecha_t,`descripcion`,orden,empleado.nombre, SEC_TO_TIME(SUM( TIME_TO_SEC(TIMEDIFF(`hora2`, `hora1`) ) + TIME_TO_SEC(TIMEDIFF(`hora4`,`hora3`) ) + TIME_TO_SEC(TIMEDIFF(`hora6`,`hora5`)) )) as total FROM tareas INNER JOIN empleado ON tareas.trabajado_r=empleado.id GROUP by empleado.nombre /* para sumar varios campos de tiempo y agruparlos
Wow Brujería, jejejejeje funciona. MIL GRACIAS.
Antes de sumar lo formateas a SEGUNDOS y después de sumar lo formateas a TIME.
Hola Jose,
Como puedo hacer para usar esta misma funcion pero con dos tablas, el campo lleva le mismo nombre.
Hola,
Me parece que no será posible utilizar esta opción o quizás tengas que hacer una LEFT JOIN a la otra tabla.
Saludos