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

[SOLUCIONADO] TIMEDIFF = NULL -> incorrecto

Estas en el tema de TIMEDIFF = NULL -> incorrecto en el foro de Mysql en Foros del Web. Buenas gente. Tengo la siguiente consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT personal_asistencia . id_personal AS ID , concat ( nombre , ' ' ...
  #1 (permalink)  
Antiguo 11/02/2018, 09:55
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 54
Antigüedad: 7 años, 10 meses
Puntos: 2
TIMEDIFF = NULL -> incorrecto

Buenas gente. Tengo la siguiente consulta:

Código SQL:
Ver original
  1. SELECT personal_asistencia.id_personal AS ID, concat(nombre, ' ', apellido) AS Nombre,
  2. time_format(SUM(timediff(salida, entrada)), '%h:%i') AS 'Horas totales',
  3. precio_hora AS 'Precio/Hora',
  4. round((SUM(timediff(MINUTE, entrada, salida)) * (precio_hora / 60)), 2) AS Pago
  5. FROM personal_asistencia
  6. INNER JOIN personal ON personal.id = personal_asistencia.id_personal
  7. INNER JOIN personal_precio_hora ON personal.id = personal_precio_hora.id_personal
  8. WHERE entrada >= '2018-02-01' AND salida <= '2018-02-28' AND personal_asistencia.id_personal = 33

que devuelve el siguiente resultado:

Código SQL:
Ver original
  1. +----+-----------------+---------------+-------------+---------+
  2. | ID | Nombre          | Horas totales | Precio/Hora | Pago    |
  3. +----+-----------------+---------------+-------------+---------+
  4. | 33 | Nombre Apellido | NULL          |         100 | 1010.00 |
  5. +----+-----------------+---------------+-------------+---------+
  6. 1 ROW IN SET, 1 warning (0.00 sec)
[/CODE]

El warning es el siguiente:

Código SQL:
Ver original
  1. +---------+------+------------------------------------------------+
  2. | Level   | Code | Message                                        |
  3. +---------+------+------------------------------------------------+
  4. | Warning | 1292 | Truncated incorrect TIME VALUE: '96600.000000' |
  5. +---------+------+------------------------------------------------+

El valor (NULL) de horas totales debería ser 10:06. (Cambié el nombre de la persona porque es una persona real).

De acá saca la info:

Código SQL:
Ver original
  1. +----+-------------+---------------------+---------------------+-----------+-------------+
  2. | id | id_personal | entrada             | salida              | id_estado | comentarios |
  3. +----+-------------+---------------------+---------------------+-----------+-------------+
  4. |  1 |          33 | 2018-02-03 13:18:00 | 2018-02-03 20:06:00 |      NULL |             |
  5. |  3 |          33 | 2018-02-03 20:09:00 | 2018-02-03 20:15:00 |      NULL |             |
  6. | 13 |          33 | 2018-02-11 08:34:00 | 2018-02-11 11:46:00 |      NULL |             |
  7. +----+-------------+---------------------+---------------------+-----------+-------------+

Sin embargo, cuando ejecuto la misma consulta para otro usuario, el 27, obtengo un resultado que no es correcto (debería ser 61:15) pero sin warnings. Aún así, en PHP obtengo el resultado correcto.

Código SQL:
Ver original
  1. +----+------------------------+---------------+-------------+---------+
  2. | ID | Nombre                 | Horas totales | Precio/Hora | Pago    |
  3. +----+------------------------+---------------+-------------+---------+
  4. | 27 | Nombre Apellido        | 01:15         |        75.6 | 4630.50 |
  5. +----+------------------------+---------------+-------------+---------+

Gracias de antemano.

Última edición por gnzsoloyo; 12/02/2018 a las 16:51 Razón: Mal etiquetado de codigo. Usar el HIGHLIGHT correcto.
  #2 (permalink)  
Antiguo 12/02/2018, 16:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.252
Antigüedad: 10 años, 2 meses
Puntos: 2639
Respuesta: TIMEDIFF = NULL -> incorrecto

SI entiendo bien, el tema pasa porque estás calculando la sumatoria de horas de cierto evento administrativo, como por ejemplo las horas trabajandas, y pretendes darle un formato de horas usando un tipo de dato TIME (TIMEDIFF devuelve un TIME). Pero el tipo de dato TIME sólo acepta 24:00 hs, nunca mas. De hecho, no existe BBDD que pueda aceptar mas de 24 hs... Porque eso como tipo de dato HORAS no existe.
Silo que quieres es obtener el tiempo total acumulado, necesitas hacerlo de otra forma:
1) Sumas los segundos totales con una función como TIMESTAMDIFF(unidad, inicio, fin).
2) Creas una funcion almacenada para que tome un valor numérico entero positivo y lo transforme en una cadena de texto con el formato HHH:MM.

O bien directamente haces el cálculo en el codebehind de la aplicación (capa de negocio o controladores), donde algunos lenguajes pueden hacer la tarea de igual forma...

Fuera de eso, si la sumatoria de tiempos en segundos es incorrecta, es posible que tengas un error en la definición de las relaciones, por estar relacionándose registros que no están vinculados, o bien le falta un correcto GROUP BY.
__________________
¿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 14/02/2018, 18:30
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 54
Antigüedad: 7 años, 10 meses
Puntos: 2
Respuesta: TIMEDIFF = NULL -> incorrecto

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pero el tipo de dato TIME sólo acepta 24:00 hs, nunca mas.
El tipo TIME admite valores desde -838:59:59 hasta 838:59:59. Lo dijiste tan convencido que volví a mirar la documentación de MySQL.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
o bien le falta un correcto GROUP BY.
La cláusula GROUP BY para esta consulta es correcta.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
O bien directamente haces el cálculo en el codebehind de la aplicación
¿Por qué ponerse a hacer operaciones con fecha y hora en la aplicación si la base de datos lo puede hacer mas rápido?

Finalmente lo solucioné. Gracias igual porque me di cuenta de que estaba usando funciones equivocadas.
Cambié esto:

Código:
date_format(sum(timestampdiff(hour, salida, entrada)), '%H:%i:%s') as 'Horas totales'
por esto:

Código:
time_format(sec_to_time(sum(timestampdiff(second, entrada, salida))), "%H:%i") as 'Horas totales',
Saludos!



La zona horaria es GMT -6. Ahora son las 23:50.