Skip to main content
Announcements
See why Qlik is a Leader in the 2024 Gartner® Magic Quadrant™ for Analytics & BI Platforms. Download Now
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Cálculo de Horas

Saludos. Necesito calcular las horas que transcurren desde que un empleado entra a trabajar hasta el momento en que sale, tengo los datos de entrada y salida con fecha y hora en el mismo archivo de Excel, pero no encuentro cómo hacer para que queden en un mismo registro. Estos son los datos de entrada:

IdEmpleadoFechaHoraTipo
1Manuel C.01/08/20143:00:00 a. m.Entrada
2Carlos A.01/08/201410:00:00 a. m.Entrada
3Manuel C.01/08/20141:00:00 p. m.Salida
4Carlos A.01/08/20148:00:00 p. m.Salida
5Teresa B.01/08/201411:00:00 p. m.Entrada
6Teresa B.02/08/20146:00:00 a. m.Salida
7Manuel C.02/08/20142:00:00 p. m.Entrada
8Manuel C.02/08/20148:00:00 p. m.Salida
9Carlos A.03/08/20146:00:00 a. m.Entrada
10Teresa B.03/08/20144:00:00 p. m.Entrada
11Teresa B.03/08/20148:00:00 p. m.Salida
12Manuel C.03/08/20148:00:00 p. m.Entrada
13Carlos A.03/08/20148:00:00 p. m.Salida
14Manuel C.04/08/20147:00:00 a. m.Salida

Y así es que necesito que quede el reporte:

EmpleadoFecha EntradaHora EntradaFecha SalidaHora Salida
Carlos A.01/08/201410:00:00 a. m.01/08/20148:00:00 p. m.
Carlos A.03/08/20146:00:00 a. m.03/08/20146:00:00 p. m.
Teresa B.01/08/201411:00:00 p. m.02/08/20146:00:00 a. m.
Teresa B.03/08/20144:00:00 p. m.03/08/20148:00:00 p. m.
Manuel C.01/08/20143:00:00 a. m.01/08/20141:00:00 p. m.
Manuel C.02/08/20142:00:00 p. m.02/08/20148:00:00 p. m.
Manuel C.03/08/20148:00:00 p. m.04/08/20147:00:00 a. m.

Agradezco cualquier ayuda.

1 Solution

Accepted Solutions
Not applicable
Author

Ya encontré la solución, la dejo por si alguien la puede necesitar. Gracias a quienes contestaron.

1. Como para cada dato de entrada debe existir uno de salida se hace una recarga de los datos, ordenados por Empleado y el campo ID. Se asume que ya está cargada la tabla [Marcaciones_x] con todos los campos. Solo se tienen en cuenta los registros 'Salida'.

[Marcaciones_y]:

LOAD

  *,

  //Si el empleado es el mismo del registro anterior, si el registro actual es de Salida y si el registro actual es mayor que el anterior, se toman la fecha y hora

  If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Fecha)) AS Fecha_Entrada,

  If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Hora)) AS Hora_Entrada,

  RESIDENT [Marcaciones_x]

  ORDER BY Ced_Empleado, Id_Registro;

2. Se hace una recarga de [Marcaciones_y] pero solo de los registros 'Salida', que son los que quedan con los datos.

3. La información de la entrada/salida de cada empleado queda en el mismo registro y se puede hacer el reporte sin problemas.

Saludos.

View solution in original post

3 Replies
ecolomer
Master II
Master II

Una posible solución es hacer una pasada de lectura y crear un fichero con los registros de entrad, a continuación hacer lo mismo con los registro de salida,

Después con ambos ficheros hacer una JOIN

Saludos,

Enrique Colomer

christian77
Partner - Specialist
Partner - Specialist

Hola.

Lo tienes bien así. No hace falta hacer join. De hecho está mejor como eventos simples con una fecha y hora de ocurrencia simple para cada evento simple. El hecho de tener 2 tipos de horas en un mismo registro complica el cálculo. Si tienes dos horas en el mismo registro, cada vez que filtres una hora de entrada, estarás filtrando horas de salida. COmpruébalo tu mismo.

El resto es el cálculo.

Yo sustituiría al empleado por un id para no repetir el nombre tantas veces.

Saludos.


Not applicable
Author

Ya encontré la solución, la dejo por si alguien la puede necesitar. Gracias a quienes contestaron.

1. Como para cada dato de entrada debe existir uno de salida se hace una recarga de los datos, ordenados por Empleado y el campo ID. Se asume que ya está cargada la tabla [Marcaciones_x] con todos los campos. Solo se tienen en cuenta los registros 'Salida'.

[Marcaciones_y]:

LOAD

  *,

  //Si el empleado es el mismo del registro anterior, si el registro actual es de Salida y si el registro actual es mayor que el anterior, se toman la fecha y hora

  If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Fecha)) AS Fecha_Entrada,

  If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Hora)) AS Hora_Entrada,

  RESIDENT [Marcaciones_x]

  ORDER BY Ced_Empleado, Id_Registro;

2. Se hace una recarga de [Marcaciones_y] pero solo de los registros 'Salida', que son los que quedan con los datos.

3. La información de la entrada/salida de cada empleado queda en el mismo registro y se puede hacer el reporte sin problemas.

Saludos.