Ver Mensaje Individual
  #6 (permalink)  
Antiguo 13/08/2014, 12:56
MatiasFiermarin
 
Fecha de Ingreso: septiembre-2011
Mensajes: 35
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Diferencia de Tiempo entre fechas

Hola, disculpen la demora ando medio complicado, eh podido resolver los dos problemas planteados.

Sobre lo que dices xeri el problema es que los registros salen de un reloj que ya los da de esa forma.

El problema estaba efectivamente en la consulta sql.

La primera consulta es esta.

Código:
SELECT Ent.cedula,
             Ent.nombre,
             Ent.fecha,
             Ent.hora,
             Sal.hora,
             sec_to_time(timestampdiff(second,Ent.hora, Sal.hora)) TotalHoras
FROM
     (SELECT Cedula,Nombre,Fecha,hora
       FROM excel
       WHERE entrada="I") Ent
  INNER JOIN
    (SELECT Cedula,Nombre,Fecha,hora
      FROM excel
      WHERE Entrada="O") Sal
   ON Ent.fecha=Sal.Fecha
        AND Ent.Cedula=Sal.Cedula
Al no dejarme tratarla de ese modo mi base de datos lo que hice fue crear 2 vistas una para cada consulta

SELECT Cedula,Nombre,Fecha,hora FROM excel WHERE entrada="I"

y

SELECT Cedula,Nombre,Fecha,hora FROM excel WHERE entrada="O"

quedando lo siguiente.

Código:
SELECT v_ntrada.cedula, v_ntrada.nombre, v_ntrada.fecha, v_ntrada.hora, v_salida.hora, SEC_TO_TIME( TIMESTAMPDIFF( 
SECOND , v_ntrada.hora, v_salida.hora ) ) TotalHoras
FROM v_ntrada
INNER JOIN v_salida ON v_ntrada.fecha = v_salida.fecha
AND v_ntrada.cedula = v_salida.cedula
ORDER BY  `v_salida`.`Nombre` ASC 
LIMIT 0 , 30
El problema de esta funcion es que me combina todos los registros, ejemplo si tengo 4 registro de la siguiente forma:

1) I
2) O
3) I
4) O

La manera correcta seria que me haga el 1 con el 2 y el 3 con el 4, pero dicha funcion combina el 1 con el 2 el 3 con el 4, el 1 con el 4 y el 3 con el 2 dando asi calculos de tiempo que estan mal.
Para solucionarlo hice una comparacion donde la hora de salida no podia ser menor a la hora de entrada y agropuarlos por la hora de esta manera no me toma el 1 y 4 y el 3 y 2.

Código:
SELECT v_ntrada.cedula, v_ntrada.nombre, v_ntrada.fecha, v_ntrada.hora, v_salida.hora, SEC_TO_TIME( TIMESTAMPDIFF( 
SECOND , v_ntrada.hora, v_salida.hora ) ) TotalHoras
FROM v_ntrada
INNER JOIN v_salida ON v_ntrada.cedula = v_salida.cedula
AND v_ntrada.hora < v_salida.hora
GROUP BY v_ntrada.hora
ORDER BY  `v_salida`.`Nombre` ASC 
LIMIT 0 , 30