Skip to main content
Announcements
Live today at 11 AM ET. Get your questions about Qlik Connect answered, or just listen in. SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
luis_bisval
Contributor III
Contributor III

Trabajar con operaciones de horas

Buenas tardes.

Estimados, espero estén muy bien, soy de Venezuela y estoy reciente en el uso de qlikview y me parece una excelente herramienta.

En estos momento estoy desarrollando una aplicación para llevar el control de acceso a las oficinas.


La información que obtengo es la siguiente:

Cédula

Fecha

H_Entrada

H_Salida

Total de Horas

15664062

2016-04-25

07:03:49

18:50:01

11:46:12

15664062

2016-04-26

13:29:05

17:56:43

04:27:38

15664062

2016-04-27

07:14:01

17:46:24

10:32:23

16429625

2016-04-26

07:10:51

17:35:31

10:24:40

16429625

2016-04-27

07:16:08

17:04:14

09:48:06

18096033

2016-04-25

06:04:20

16:50:55

10:46:35

18096033

2016-04-26

06:04:04

16:49:35

10:45:31

18096033

2016-04-27

05:53:17

15:35:21

09:42:04

La expresión "Total de Horas" la la extraigo de la siguiente forma: Interval(H_Salida-H_Entrada, ' hh:mm').


Actualmente estoy detenido, ya que necesito obtener en una expresión que me indique si cada empleado cumplió con el total de horas por día, dándose ciertas condiciones las cuales detallo a continuación.


  • Que cumplan con 9 horas 45 minutos por día.
  • En un rango de 7:00:00 a 18:00:00.
  • Que la hora de H_entrada sea <= 8:01:00 y la H_Salida sea >= 16:59:00


He dedicado más de 3 semanas buscando en foros y tutoriales y de verdad que no logro manejar las expresiones con horas.


Agradezco mucho su colaboración.


1 Solution

Accepted Solutions
sorrakis01
Specialist
Specialist

Hola,

El script por ejemplo te quedaría así (adaptalo a tu código):

Horas:

LOAD * INLINE [

Emp, HoraIn, HoraOut

1, 07:05:10, 20:45:00

2, 08:00:00, 19:00:00

3, 12:00:00, 18:00:00

4, 06:55:10, 17:45:00

];

Final:

Load Emp,

HoraIn,

HoraOut,

Interval(RangeMin(HoraOut,MakeTime(17)) - RangeMax(HoraIn, MakeTime(7)),'hh:mm:ss')  as HorasTrabajas_7_a_17,

Interval(RangeMin(HoraOut,MakeTime(17)) - HoraIn,'hh:mm:ss')  as HorasTrabajadas,

If(HoraIn<=MakeTime(7) and HoraOut>=MakeTime(17),'En Tiempo','Fuera de Tiempo') as Estado_Tiempo

resident Horas;

Drop Table Horas;

Con Respecto a lo de la fracción de Hora no lo acabo de entender. Lo que hace el MaKeTime es crearte la hora --> MakeTime(7) = 07:00:00... Entonces te aseguras que las horas del trabajador siempre te las sume dentro del horario establecido. Es decir, si ellos trabajan de 7 a 17:00 si entran a las 6:55 esos 5 minutos no le van a contar en el caso Horas_Trabajadas_7_a_17 pero si en el caso HorasTrabajadas.

El MakeTime si quieres hacer las 7:15 pues tienes que poner MakeTime(7,15)

Saludos,

View solution in original post

8 Replies
sorrakis01
Specialist
Specialist

Hola Luis,

Para el intervalo de las horas prueba mejor con esto (ya que te calculará siempre de 7 a 17:00)

Horas:

LOAD * INLINE [

Emp, HoraIn, HoraOut

1, 07:05:10, 20:45:00

2, 08:00:00, 19:00:00

3, 12:00:00, 18:00:00

4, 06:55:10, 17:45:00

];

Final:

Load Emp,

HoraIn,

HoraOut,

Interval(RangeMin(HoraOut,MakeTime(17)) - RangeMax(HoraIn, MakeTime(7)),'hh:mm:ss')  as HorasTrabajadas

resident Horas;

Drop Table Horas;

O si no quieres poner hora de entrada:

Interval(RangeMin(HoraOut,MakeTime(17)) - HoraIn,'hh:mm:ss')  as HorasTrabajadas

Si lo que quieres es que solo te sume si cumple ponle un If delante pero tienes que pensar que vas a hacer con las horas que te faltan o que no cuentan... (es decir si entro a las 8:15 no me suman las horas?)

Saludos,

luis_bisval
Contributor III
Contributor III
Author

Hola Jordi, gracias por tu pronta respuesta, me falto colocar en mi enunciado que deseo obtener es un texto que me diga "En tiempo" o "Fuera de Tiempo". Si se cumple las condiciones anteriores diga "En Tiempo" si no se cumple diga "Fuera de Tiempo"

Me surge la duda cuando me dices que solo me calculará de 7 a 17. Como se haría si quiero calcular una fracción de hora?

sorrakis01
Specialist
Specialist

Hola,

El script por ejemplo te quedaría así (adaptalo a tu código):

Horas:

LOAD * INLINE [

Emp, HoraIn, HoraOut

1, 07:05:10, 20:45:00

2, 08:00:00, 19:00:00

3, 12:00:00, 18:00:00

4, 06:55:10, 17:45:00

];

Final:

Load Emp,

HoraIn,

HoraOut,

Interval(RangeMin(HoraOut,MakeTime(17)) - RangeMax(HoraIn, MakeTime(7)),'hh:mm:ss')  as HorasTrabajas_7_a_17,

Interval(RangeMin(HoraOut,MakeTime(17)) - HoraIn,'hh:mm:ss')  as HorasTrabajadas,

If(HoraIn<=MakeTime(7) and HoraOut>=MakeTime(17),'En Tiempo','Fuera de Tiempo') as Estado_Tiempo

resident Horas;

Drop Table Horas;

Con Respecto a lo de la fracción de Hora no lo acabo de entender. Lo que hace el MaKeTime es crearte la hora --> MakeTime(7) = 07:00:00... Entonces te aseguras que las horas del trabajador siempre te las sume dentro del horario establecido. Es decir, si ellos trabajan de 7 a 17:00 si entran a las 6:55 esos 5 minutos no le van a contar en el caso Horas_Trabajadas_7_a_17 pero si en el caso HorasTrabajadas.

El MakeTime si quieres hacer las 7:15 pues tienes que poner MakeTime(7,15)

Saludos,

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Luis:

Mi procedimiento para gestionar tiempo es convertirlo a minutos (o segundos cuando aplica).

En tu ejemplo:

LOAD Hour(HoraEntrada) * Minute(HoraEntrada) as MinutoEntrada

          Hour(HoraSalida) * Minute(HoraSalida) as MinutoSalida

          Hour(HoraSalida) * Minute(HoraSalida) Hour(HoraEntrada) * Minute(HoraEntrada) as MinutosTrabajado

9h 45' = 585 '

Minuto Inicial Rango =  420

Minuto Final Rango = 1080

Antes de las 08:01 <= 481

Después de las 16:59 => 1019

A partir de este punto creo que las comparaciones entre minutos trabajados y el resto de valores son más sencillas

Si te gusta esta posibilidad le daremos más vueltas.

Saludos

Joaquín

luis_bisval
Contributor III
Contributor III
Author

Buenos días.

Gracias Jordi por tu respuesta, utilice tu sugerencia en una expresión.

If(H_Entrada<=MakeTime(7,15) and H_Salida>=MakeTime(17),'Cumple','No Cumple')

Me funciono perfectamente.

De verdad muchas gracias a todos y me disculpan el no haber respondido antes.

sorrakis01
Specialist
Specialist

Hola Luis,

Genial, me alegra que lo hayas podido solucionar.

Cierra el hilo para que la gente pueda consultar en próximas ocasiones.

Saludos,

luis_bisval
Contributor III
Contributor III
Author

Disculpa mi ignorancia, como cierro el hilo de esta discusión?

sorrakis01
Specialist
Specialist

Hola Luis,

De ignorancia nada, era que marcases la respuesta como correcta para que la gente si algun dia busca vea que se ha solucionado el caso.

Saludos,