2009-08-25 16 views
8

Tengo una tabla que contiene los valores de fecha y hora en este formato:MySQL - ¿Cómo SUMAR veces?

START

1/13/2009 7:00:00 AM

FIN

1/13/2008 2:57:00 PM

Utilizo la función 'str to date' para convertirlos en un formato de fecha y hora.

¿Cómo calculo la diferencia entre ellos? Y a continuación, resúmalo para que se muestre en horas totales (es decir, el total de horas por semana es 40:53).

Estaba probando la función timediff pero los resultados no suman.

Respuesta

4

Trate de buscar en UNIX_TIMESTAMP y SEC_TO_TIME.

Se podría resumir las diferencias entre las marcas de tiempo, a continuación, utilizar ese valor (que sería en milisegundos) para obtener el tiempo:

SELECT SEC_TO_TIME(time_milis/1000) 
FROM (
    SELECT SUM(UNIX_TIMESTAMP(date1) - UNIX_TIMESTAMP(date2)) as time_milis 
    FROM table 
) 
+0

Gracias - Convertí las cadenas de fecha y hora en segundos - calculó la diferencia - y luego convirtió los segundos de nuevo a horas-minutos. –

+0

Corrección: la función time_to_sec no se aplica a la parte de fecha, solo la parte de tiempo, por lo que tomar 2009-08-25 01:06:00 menos 2009-08-24 15:35:00 da como resultado un número negativo. Necesitaré usar la función timediff. –

6

Mira la MySQL DateDiff Function

SELECT SUM(DATEDIFF(endtime, starttime)) 
FROM somerecordstable 
WHERE starttime > '[some date]' AND endtime <= '[some date]' 

También puede probar:

SELECT SUM(TIMEDIFF(endtime, starttime)) 
FROM somerecordstable 
WHERE starttime > '[some date]' AND endtime <= '[some date]' 

no he probado el segundo, pero sé el primero debería funcionar.

+0

Esta es la idea correcta, sino que le dará una respuesta en días. Tendría que hacer una multiplicación o usar otra función de fecha para convertir eso en horas: minutos –

+0

Gracias - definitivamente necesita ser horas, ya que la consulta necesita encontrar el tiempo total de trabajo para los empleados para una semana determinada. –

+0

el segundo ejemplo que doy debería darle la respuesta correcta – Jason

1
SELECT some_grouping_column, SUM(TIMEDIFF(datecol1,datecol2)) as tot_time 
FROM my_table 
GROUP BY some_grouping_column; 
+0

¿Se devuelve el resultado en minutos? –

+0

devuelve hh: mm: ss http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff – dnagirl

40

Yo creo que hay que usar este código funciona ... :)

SELECT 
    SEC_TO_TIME(SUM(TIME_TO_SEC(`time`))) AS total_time 
FROM time_table; 
+0

Cuando hice esto en MySQL tuve que crear una tabla tmp (con subconsulta), porque de lo contrario el LÍMITE no funcionaría: 'select sec_to_time (sum (secs)) from (seleccione TIME_TO_SEC (TIMEDIFF (end_time, start_time)) secs del orden de reservas por id desc limit 10) t; 'Weird. – Rudie