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:
- Use TIME_TO_SEC para convertir TIME a segundos para operaciones matemáticas
- suma la diferencia
- 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_TIMESTAMP
s 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.