Ver Mensaje Individual
  #15 (permalink)  
Antiguo 19/04/2013, 00:05
maialenlopez
 
Fecha de Ingreso: abril-2012
Mensajes: 449
Antigüedad: 12 años, 1 mes
Puntos: 7
Respuesta: restar las horas de un datetime en mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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.
Seria algo como esto?
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.         noperario = 466
  8.         AND YEAR(desde) = 2011
  9.         AND MONTH(desde) = 04
  10.         AND YEAR(hasta) = 2011
  11.         AND MONTH(hasta) = 04
  12.         AND TIME(DESDE) > TIME(HASTA)) T1
  13.     INNER JOIN
  14.     (SELECT
  15.         DATE(desde) fecha,
  16.         TIMESTAMPDIFF(SECOND, desde, DATE_ADD(DATE(desde), INTERVAL 86399 SECOND)) horasinicio
  17.     FROM tabla
  18.     WHERE
  19.         noperario = 466
  20.         AND YEAR(desde) = 2011
  21.         AND MONTH(desde) = 04
  22.         AND YEAR(hasta) = 2011
  23.         AND MONTH(hasta) = 04
  24.         AND TIME(hasta) > TIME(desde)
  25.         AND DATE(desde) = DATE_SUB(hasta, INTERVAL 1 DAY)) T2 ON T1.fecha = T2.fecha AND T1.noperario = T2.noperario;
__________________
Gracias por todo;

Un saludo