Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Diferencia de Tiempo entre fechas

Estas en el tema de Diferencia de Tiempo entre fechas en el foro de PHP en Foros del Web. Buenas, hace un tiempo me dieron una solución para calcular la diferencia de tiempo entre 2 fechas de formato (dd-mm-yyyy hh-mm-ss) que me sirvió pero ...
  #1 (permalink)  
Antiguo 11/08/2014, 11:36
 
Fecha de Ingreso: septiembre-2011
Mensajes: 35
Antigüedad: 8 años, 5 meses
Puntos: 0
Diferencia de Tiempo entre fechas

Buenas, hace un tiempo me dieron una solución para calcular la diferencia de tiempo entre 2 fechas de formato (dd-mm-yyyy hh-mm-ss) que me sirvió pero tengo un problema.

Primero voy a describir las tablas.

Tabla "Excel" (Tabla donde se cargan los datos del reloj)
- Id
- cedula
- nombre
- hora (del formato dicho anteriormente)
- Forma_Ingreso (Huella Digital o Manual)
- entrada ( I o O Int - Out en otras palabras)
- fecha

De esta table cree 2 vistas para separar las entradas y las salidas

v_entrada
v_salida

Luego de esto cree otra vista que seria un intersect de las dos para sacar los registros que tienen salida y entrada y no solo entrada o solo salida.

Ejemplo si hay un registro de entrada del día 05-08-2014 pero no hay salida para este día no se toma en cuenta.

Aquí surge mi primer problema ya que un empleado puede entrar a las 18:00:00 del día 05-08-2014 y salir a las 00:00:00 del día 06-08-2014.

luego para calcular la diferencia de tiempo entre entrada y salida hago lo siguiente

Código PHP:
Ver original
  1. function RegistrarHorarios(){
  2.     $datos=Seleccionar("v_todo","*","fecha BETWEEN '".$_POST['fecha1']."' AND '".$_POST['fecha2']."' GROUP BY cedula");
  3.     $cedula;
  4.     $id;
  5.     $horastrab;
  6.     $texto = "";
  7.     while ($row=mysql_fetch_array($datos)) {
  8.         $cedula = $row['cedula'];
  9.         $datos2=Seleccionar("empleados","*","Cedula=".$cedula."");
  10.         while($row2=mysql_fetch_array($datos2)){
  11.             $id= $row2['IdEmpleado'];
  12.         }
  13.         if($id==''){
  14.         }else{ 
  15.             $datos3=Seleccionar("empleadosector a1, sector a2","*","a1.IdEmpleado=".$id." AND a1.IdSector=a2.IdSector");
  16.             if(mysql_num_rows($datos3)!=0){
  17.                 while($row2=mysql_fetch_array($datos3)){
  18.                     $horastrab = $row2['Horas'];
  19.                     break;
  20.                 }
  21.                 $datos5=Seleccionar("v_todo","fecha, SEC_TO_TIME(SUM(TIME_TO_SEC(TotalHoras))) AS Total","cedula=".$cedula." AND fecha BETWEEN '".$_POST['fecha1']."' AND '".$_POST['fecha2']."' GROUP BY fecha");
  22.                 while($row3=mysql_fetch_array($datos5)){
  23.                     $horastrabajadas = $row3['Total'];
  24.                     //return "Cedula ". $cedula ." id ". $id ."Horas de trab ".$horastrab." horas trabajadas ".$horastrabajadas;
  25.                     $diferenciatiempo = Seleccionar("","TIMEDIFF('".$horastrabajadas."','".$horastrab."') AS Horas","");
  26.                     while($row2=mysql_fetch_array($diferenciatiempo)){
  27.                         $horasdetrab2 = $row2['Horas'];
  28.                         $horasccte = Seleccionar("ccte","DiferenciaTiempo","Id_Empleado=".$id);
  29.                         while($ccte=mysql_fetch_array($horasccte)){
  30.                             $horaccte = $ccte['DiferenciaTiempo'];
  31.                             //$texto = $texto." Cedula ". $cedula ." id ". $id ." Horas de trab ".$horastrab." horas trabajadas ".$horastrabajadas."DIFERENCIA ".$horasdetrab2." CCTE ".$horaccte;
  32.                             $actualizoccte=Modificar("ccte","DiferenciaTiempo=ADDTIME('".$horaccte."','".$horasdetrab2."')","Id_Empleado=".$id);
  33.                             break 3;
  34.                         }
  35.                     }
  36.                 }
  37.             }else{
  38.                 $datos4=Seleccionar("empleadosector_rot a1, sector_rot a2","*","a1.IdEmpleado=".$id." AND a1.IdSector_Rot=a2.IdSector_Rot");
  39.                 while($row2=mysql_fetch_array($datos4)){
  40.                     $horastrab = $row2['Horas'];
  41.                     break;
  42.                 }
  43.                 $datos5=Seleccionar("v_todo","fecha, SEC_TO_TIME(SUM(TIME_TO_SEC(TotalHoras))) AS Total","cedula=".$cedula." AND fecha BETWEEN '".$_POST['fecha1']."' AND '".$_POST['fecha2']."' GROUP BY fecha");
  44.                 while($row3=mysql_fetch_array($datos5)){
  45.                     $horastrabajadas = $row3['Total'];
  46.                     //return "Cedula ". $cedula ." id ". $id ."Horas de trab ".$horasdetrab." horas trabajadas ".$horastrabajadas;
  47.                     $diferenciatiempo = Seleccionar("","TIMEDIFF('".$horastrabajadas."','".$horastrab."') AS Horas","");
  48.                     while($row2=mysql_fetch_array($diferenciatiempo)){
  49.                         $horasdetrab2 = $row2['Horas'];
  50.                         $horasccte = Seleccionar("ccte","DiferenciaTiempo","Id_Empleado=".$id);
  51.                         while($ccte=mysql_fetch_array($horasccte)){
  52.                             $horaccte = $ccte['DiferenciaTiempo'];
  53.                             //$texto = $texto." Cedula ". $cedula ." id ". $id ." Horas de trab ".$horastrab." horas trabajadas ".$horastrabajadas."DIFERENCIA ".$horasdetrab2." CCTE ".$horaccte;
  54.                             $actualizoccte=Modificar("ccte","DiferenciaTiempo=ADDTIME('".$horaccte."','".$horasdetrab2."')","Id_Empleado=".$id);
  55.                             break 3;
  56.                         }
  57.                     }
  58.                 }
  59.             }
  60.         }
  61.     }
  62.     return "Horas Registradas";
  63. }

El tema es que me calcula las horas pero si tengo 4 registros 2 I y 2 O siendo de el siguiente modo.

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

Me calcula el tiempo de 1 con el 2 y del 3 con el 4 (esto esta bien) y luego del 1 con el 4 y el 3 con el 2 en otras palabras todas las combinaciones, alguien me puede ayudar con estos dos problemas?

Gracias.
  #2 (permalink)  
Antiguo 11/08/2014, 11:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.322
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Diferencia de Tiempo entre fechas

Sin SQL puro el tema es OFF-TOPIC en MySQL.
Hay demasiadas cosas dependientes del PHP, y aparentemente el problema es combinado.

Movido a un foro más adecuado.
__________________
¿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 11/08/2014, 12:10
 
Fecha de Ingreso: septiembre-2011
Mensajes: 35
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Diferencia de Tiempo entre fechas

Ahora estuve revisando un poco el código y estaba bien en mysql ya que es de ahí donde empieza el problema por lo que veo en mis tablas, ya que en la vista llamada v_todo ya empiezan los registros mal, el INNER JOIN que hago entre las tablas v_entrada y v_salida hace lo que mencione a lo ultimo.

Cita:
El tema es que me calcula las horas pero si tengo 4 registros 2 I y 2 O siendo de el siguiente modo.

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

Me calcula el tiempo de 1 con el 2 y del 3 con el 4 (esto esta bien) y luego del 1 con el 4 y el 3 con el 2 en otras palabras todas las combinaciones, alguien me puede ayudar con estos dos problemas?
Quizás si se pudiera hacer un algo así como un if en el sql en la función donde empareje el primer horario con el segundo y vea que el segundo es mayor al primero y ahí si siga su camino de lo contrario no.

Pero si hay un poco de sql y php combinado.
  #4 (permalink)  
Antiguo 11/08/2014, 13:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.322
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Diferencia de Tiempo entre fechas

Cita:
Quizás si se pudiera hacer un algo así como un if en el sql en la función donde empareje el primer horario con el segundo y vea que el segundo es mayor al primero y ahí si siga su camino de lo contrario no.
El problema es que construyes demasiado dinámicamente la consulta (y no sabemos en qué parte, porque no posteas esa función), por lo que resultaría muy difícil desde lo que nos muestras indicarte la solución a nivel datos.
Si puedes postear la estructura de las tablas y una muestra de datos contenidos en ellas, podríamos hacer una query que devuelva lo que quieres, sobre la base de la cual puedes luego desarrollar el código para su creación dinámica, de acuerdo a lo que necesites.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/08/2014, 08:28
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 9 años, 3 meses
Puntos: 123
Respuesta: Diferencia de Tiempo entre fechas

No termino de comprender tu problema.
O mas bien no se darte una solución a lo que planteas.

Yo personalmente lo abordaria de otra forma,
En lugar de crear 2 registros, uno para la entrada y otro para la salida, crearia un solo registro que contenga los dos.

Me explico, haria una tabla con
Id
Celula
Nombre o id usuario
Fecha_hora_entrada
Fecha_hora_salida
Tipo_acceso

Cuando se produzca una entrada, realizo un insert creando asi el registro y relleno todo menos hora salida
Cuando se realize la salida, realizo un update del hora salida, filtrando por el ultimo registro que se a creado, donde coincida el id usuario.

De esta forma te seria mucho mas facil procesar los datos, y comprobar o listar los accesos.

Por otro lado al tener o necesitar la mitad de registro la velocidad de tus consultas sera algo mejor.

Última edición por xerifandtomas; 12/08/2014 a las 08:41
  #6 (permalink)  
Antiguo 13/08/2014, 13:56
 
Fecha de Ingreso: septiembre-2011
Mensajes: 35
Antigüedad: 8 años, 5 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

Etiquetas: diferencia, mysql, registro, sql, tabla, tiempo
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 06:53.