Saltar al contenido

MySQL: ¿Cómo SUM () un TIMEDIFF () en un grupo?

Necesitamos tu ayuda para extender nuestras secciones sobre las ciencias de la computación.

Solución:

Usar:

  SELECT t.user_id,       
         SEC_TO_TIME(SUM(TIME_TO_SEC(t.endtime) - TIME_TO_SEC(t.starttime))) AS timediff
    FROM MYTABLE t
GROUP BY t.user_id

Pasos:

  1. Use TIME_TO_SEC para convertir TIME a segundos para operaciones matemáticas
  2. suma la diferencia
  3. Use SEC_TO_TIME para convertir los segundos a TIME

Según los datos de muestra, simplemente habría sugerido:

  SELECT t.user_id,       
         TIMEDIFF(MIN(t.startdate), MAX(t.enddate)) AS timediff
    FROM MYTABLE t
GROUP BY t.user_id   

NOTA: Hay un error en este código si está utilizando datetime. TIME_TO_SEC solo convierte la sección de tiempo, por lo que termina con grandes negativos si el reloj pasa de la medianoche. Use UNIX_TIMESTAMP en su lugar para hacer la suma. También SEC_TO_TIME alcanza un máximo en valores superiores a 3020399 segundos, por ejemplo, SELECT TIME_TO_SEC(SEC_TO_TIME(3020400)); Si ve este valor 838:59:59, ha alcanzado el máximo y probablemente solo necesite dividir por 3600 para mostrar solo las horas.

AFAIK, tu única opción es lanzar a UNIX_TIMESTAMPs y hacer algunos cálculos con números enteros, sustituyendo una fecha aleatoria (elegí 2000-01-01) por columnas TIME sin fecha.

SELECT TIMEDIFF(
    DATE_ADD('2000-01-01 00:00:00',
       INTERVAL 
       SUM(UNIX_TIMESTAMP(CONCAT('2000-01-01 ',TimeDiff)) - UNIX_TIMESTAMP('2000-01-01 00:00:00')
       SECOND),
    '2000-01-01 00:00:00')
FROM MyTable;

porque puede parecer puede SUM columnas TIME, pero en realidad se convertirán en enteros desagradables o flotantes que no seguirán las especificaciones de tiempo (pruébelo con una suma de minutos> 60 y verá a qué me refiero).


Para los que dicen que puedes SUM columnas de tiempo:

mysql> create table timetest(a TIME);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO timetest VALUES ('02:00'),('03:00');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT SUM(a) FROM timetest;
+--------+
| SUM(a) |
+--------+
|  50000 |
+--------+
1 row in set (0.00 sec)

mysql> SELECT TIME(SUM(a)) FROM timetest;
+--------------+
| TIME(SUM(a)) |
+--------------+
| 05:00:00     |
+--------------+
1 row in set (0.00 sec)

mysql> -- seems ok, but wait
mysql> INSERT INTO timetest VALUES ('02:30');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT TIME(SUM(a)) FROM timetest;
+--------------+
| TIME(SUM(a)) |
+--------------+
| 07:30:00     |
+--------------+
1 row in set (0.00 sec)

mysql> -- and now, oh ye unbelievers:
mysql> INSERT INTO timetest VALUES ('01:40');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT TIME(SUM(a)) FROM timetest;
+--------------+
| TIME(SUM(a)) |
+--------------+
| NULL         |
+--------------+
1 row in set, 1 warning (0.00 sec)

mysql> -- why is that? because it uses integer arithmetic, not time - arithmetic:
mysql> SELECT SUM(a) FROM timetest;
+--------+
| SUM(a) |
+--------+
|  87000 |
+--------+
1 row in set (0.00 sec)

mysql> -- that cannot be cast to time

Te mostramos reseñas y puntuaciones

Si estás contento con lo expuesto, eres capaz de dejar una crónica acerca de qué le añadirías a este ensayo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *