Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Excedo el valor maximo de time

Estas en el tema de Excedo el valor maximo de time en el foro de Mysql en Foros del Web. Hola, tengo esta consulta SELECT sec_to_time(sum(time_to_sec(TiempoTotal))) FROM `servicio` where Month(fecha) =06 El cual me suma las horas trabajadas en un mes. Mi problema es que ...
  #1 (permalink)  
Antiguo 09/07/2010, 15:37
 
Fecha de Ingreso: diciembre-2001
Ubicación: Peru
Mensajes: 376
Antigüedad: 22 años, 11 meses
Puntos: 0
Excedo el valor maximo de time

Hola, tengo esta consulta
SELECT sec_to_time(sum(time_to_sec(TiempoTotal)))
FROM `servicio`
where Month(fecha) =06

El cual me suma las horas trabajadas en un mes.
Mi problema es que suma mas de 1000 horas, y time solo sopota hasta
838:59:59 horas.
Como puedo hacer para visualizar el total.
Gracias
  #2 (permalink)  
Antiguo 09/07/2010, 17:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Excedo el valor maximo de time

Básicamente es imposible que el total de horas asignadas a una misma instancia de una entidad pueda llegar a esa cifra (una persona no puede trabajar 1000 horas en un mes, porque un mes sólo tiene 744 en total), lo que me indica que estás haciendo una sumatoria sin desagregaciones, para la cual, no debería ser necesario representarlo en formato HH:MM:SS.
En cualquier caso, lo que tienes que hacer es o construir el string de horas artificialmente, o representar el tiempo transcurrido en un formato DD.HH.mm.ss, que sí podría ser más o menos lógico.
Una forma sencilla sería:
Código MySQL:
Ver original
  1.     IF(TTotal<86400, SEC_TO_TIME(Ttotal), CONCAT((TTotal DIV 86400), '.', (SEC_TO_TIME(Ttotal &#37; 86400))))
  2. FROM (SELECT sum(time_to_sec(TiempoTotal)) TTotal FROM `servicio` WHERE Month(fecha) =06) T1;
Para que se entienda las funciones usadas, si el valor sumado de TTtotal fuese de 100.000, el resultado sería:

Código MySQL:
Ver original
  1. mysql> SELECT IF(100000<86400, SEC_TO_TIME(100000), CONCAT((100000 DIV 86400), '.', (SEC_TO_TIME(100000 % 86400)))) TiempoTotal;
  2. +-------------+
  3. | TiempoTotal |
  4. +-------------+
  5. | 1.03:46:40  |
  6. +-------------+
  7. 1 row in set (0.00 sec)
Y si fuese menor a 86400:
Código MySQL:
Ver original
  1. mysql> SELECT IF(11000<86400, SEC_TO_TIME(11000), CONCAT((11000 DIV 86400), '.', (SEC_TO_TIME(11000 % 86400)))) TiempoTotal;
  2. +-------------+
  3. | TiempoTotal |
  4. +-------------+
  5. | 03:03:20    |
  6. +-------------+
  7. 1 row in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 10/07/2010, 01:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Excedo el valor maximo de time

Sólo un apunte, que ya había anticipado gnzsoloyo, por si sirve de orientación. Lo que tú habías escrito:
SELECT sec_to_time(sum(time_to_sec(TiempoTotal)))
FROM `servicio`
where Month(fecha) =06
te busca la suma de horas de todos los trabajadores en los meses de junio de todas las fechas que tengas. ¿Es eso lo que quieres?
  #4 (permalink)  
Antiguo 12/07/2010, 08:49
 
Fecha de Ingreso: diciembre-2001
Ubicación: Peru
Mensajes: 376
Antigüedad: 22 años, 11 meses
Puntos: 0
Respuesta: Excedo el valor maximo de time

Bueno me falto poner el

SELECT sec_to_time(sum(time_to_sec(TiempoTotal)))
FROM `servicio`
where Month(fecha) =06 and YEAR(fecha) =2010

Suma mas de mil por que son como 20 trabajadores de soporte, es por ello que puede sumer esa cantidad.
  #5 (permalink)  
Antiguo 12/07/2010, 08:53
 
Fecha de Ingreso: diciembre-2001
Ubicación: Peru
Mensajes: 376
Antigüedad: 22 años, 11 meses
Puntos: 0
Respuesta: Excedo el valor maximo de time

Hola,
gnzsoloyo,
el correr el select, me sale este error

ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '86400))))
FROM (SELECT sum(TIME_TO_SEC(TiempoTotal)) TTotal FROM `servicio` WHERE' at line 1

No entiendo por que tiene 2 FROM.
Saludos

Última edición por Murallitz; 12/07/2010 a las 08:59
  #6 (permalink)  
Antiguo 12/07/2010, 09:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Excedo el valor maximo de time

Cita:
gnzsoloyo, con tu codigo me salen 1236 filas de rsltado con el mismo resultado
1.03:46:40
Eso es un problema que debes resolver desde tu consulta.
Lo que yo te doy es solamente cómo resolver el problema de representación, pero nada más.
En tu caso, , además, el problema es que la consulta debe devoler un único valor a través del agrupamiento, cosa que parece que no estás haciendo, porque ese error se da solamente cuando hay un JOIN presente que no participa de la tabla agrupada.
Postea la sentencia completa tal y como la estás usando para ver dónde está el inconveniente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 12/07/2010, 13:11
 
Fecha de Ingreso: diciembre-2001
Ubicación: Peru
Mensajes: 376
Antigüedad: 22 años, 11 meses
Puntos: 0
Respuesta: Excedo el valor maximo de time

Yo pongo la consulta tal cual

SELECT IF(TTotal<86400, SEC_TO_TIME(Ttotal), CONCAT((TTotal DIV 86400), '.', (SEC_TO_TIME(Ttotal % 86400))))
FROM (SELECT sum(TIME_TO_SEC(TiempoTotal)) TTotal FROM `servicio` WHERE MONTH(fecha) =06) T1

y sale ese error.
Saludos
  #8 (permalink)  
Antiguo 12/07/2010, 13:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Excedo el valor maximo de time

Mira, volví a probar la consulta contra una base con datos del tipo necesario, y no contiene ni errores de sintaxis, ni hay errores en los datos devueltos.
Eso sería:
Código MySQL:
Ver original
  1.   IF(TTotal < 86400, SEC_TO_TIME(Ttotal), CONCAT((TTotal DIV 86400), '.', (SEC_TO_TIME(Ttotal &#37; 86400)))) TiempoTotal
  2.   (SELECT SUM(TIME_TO_SEC(TiempoTotal)) TTotal
  3.   FROM `servicio`
  4.   WHERE MONTH(Fecha)=06 AND YEAR(Fecha)=2010 ) T1;
Sólo me queda suponer que no hayas copiado perfectamente la sentencia de muestra en alguna forma. Por eso te pedía el post de la que hayas usado, no de la que yo puse...
Puedes haber copiado y pegado, pero no haberlo hecho correctamente. Hay que comprobar.
Otra posibilidad es que se trate de una versión de MySQL muy vieja.

Ejecuta la sentencia
Código MySQL:
Ver original 
y cuentanos qué te devuelve...

En cuanto al FROM adicional, eso es una subconsulta.
¿Has visto el tema de subconsultas alguna vez?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 12/07/2010, 15:11
 
Fecha de Ingreso: diciembre-2001
Ubicación: Peru
Mensajes: 376
Antigüedad: 22 años, 11 meses
Puntos: 0
Respuesta: Excedo el valor maximo de time

Holas!
La version que sale es esta

5.0.88
  #10 (permalink)  
Antiguo 12/07/2010, 15:14
 
Fecha de Ingreso: diciembre-2001
Ubicación: Peru
Mensajes: 376
Antigüedad: 22 años, 11 meses
Puntos: 0
Respuesta: Excedo el valor maximo de time

Para conocimiento, dime esta parte de la consulta que es lo que hace
&#37
Gracias!
  #11 (permalink)  
Antiguo 12/07/2010, 16:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Excedo el valor maximo de time

Eso es un error del script en FDW, porque no reconoce el caracter porcentual en algunos casos. Esa parte debe decir:
Cita:
IF(TTotal < 86400, SEC_TO_TIME(Ttotal), CONCAT((TTotal DIV 86400), '.', (SEC_TO_TIME(Ttotal % 86400)))) TiempoTotal
El caracter porcentual, en ese contexto, equivale al resto de división entera.
Eso significa que dado dos números A y B, siendo que A > B, esa división devuelve cociente C y un resto R tal que (C . B) + R = A.
En este caso 86400, sabemos, es la cantidad de segundos del día. La operación elimina todos los segundos equivalentes a días enteros y devuelve la cantidad restante.
Eso es todo.

Es la operación complementaria a N DIV M, que también se usa en este caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 12/07/2010 a las 16:33
  #12 (permalink)  
Antiguo 12/07/2010, 16:37
 
Fecha de Ingreso: diciembre-2001
Ubicación: Peru
Mensajes: 376
Antigüedad: 22 años, 11 meses
Puntos: 0
Respuesta: Excedo el valor maximo de time

Excelente!!! ya funciona!!!!
Muchisimas gracias por tu tiempo y ayuda!!!!
  #13 (permalink)  
Antiguo 12/07/2010, 17:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Excedo el valor maximo de time

Por nada, para eso andamos por acá...

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: maximo, time
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:58.