Ver Mensaje Individual
  #14 (permalink)  
Antiguo 18/04/2013, 21:05
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: restar las horas de un datetime en mysql

Bueno, al final, luego de revisar el SP que había construido para este fin, me encontré que es demasiado complejo para una prueba inicial. La verdad, es para expertos en MySQL (terriblemente complejo, con tablas temporales, tablas de hechos, uso de variables de sesión, parametrizaciones varias, control de excepciones... un asco. Estaba hecho para un sistema empresario).
Como sea, tomé la lógica básica y te armé este modelo, que tal vez se entienda:
Código MySQL:
Ver original
  1. SELECT T1.fecha, SEC_TO_TIME(T1.horasinicio + T2.horasinicio) totalHorasdía
  2.     (SELECT
  3.         DATE(hasta) fecha,
  4.         TIMESTAMPDIFF(SECOND, DATE_ADD(DATE(desde), INTERVAL 86399 second), hasta) horasfin
  5.     FROM tabla
  6.     WHERE
  7.         YEAR(desde) = 2011
  8.         AND MONTH(desde) = 04
  9.         AND YEAR(hasta) = 2011
  10.         AND MONTH(hasta) = 04
  11.         AND TIME(DESDE) > TIME(HASTA)) T1
  12.     INNER JOIN
  13.     (SELECT
  14.         DATE(desde) fecha,
  15.         TIMESTAMPDIFF(SECOND, desde, DATE_ADD(DATE(desde), INTERVAL 86399 second)) horasinicio
  16.     FROM tabla
  17.     WHERE
  18.         YEAR(desde) = 2011
  19.         AND MONTH(desde) = 04
  20.         AND YEAR(hasta) = 2011
  21.         AND MONTH(hasta) = 04
  22.         AND TIME(hasta) > TIME(desde)
  23.         AND DATE(desde) = DATE_SUB(hasta, INTERVAL 1 DAY)) T2 ON T1.fecha = T2.fecha;
La idea es que se hacen dos subconsultas, cada una para obtener una mitad del día: Las horas desde cierta hora hasta medianoche, y las que corresponden a las cero horas hasta la mañana.
Cada subconsulta construye una tabla derivada (en el FROM), las cuales a su vez se emparejan con un JOIN, devolviendo un único por día. As su vez, la subconsulta sólo obtiene los segundos y luego se suman en la consulta mayor, para convertirlos en horas.
Para que te sea funcional hay que agregar a cada subconsulta el ID del cliente, empelado o usuario buscado, y agregar ese mismo datos como parte del ON del JOIN.
Prueba bosquejar tu consulta sobre este esquema y posteala. Veremos si se ha entendido, antes de probarla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)