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: 
chematos
Specialist II
Specialist II

Diferencia entre fechas formato numérico

Hello, I'm trying to create new columns as I loaded the rows in a table resident with the difference between the date of the next row with the date of the current row:

TIEMPO:

LOAD Tarjeta as ID_Tarjeta,

     peek('TimeFloor',RecNo()+1) - peek('TimeFloor',RecNo()) as Tiempo,

     peek('TimeFloor',RecNo()+1) - peek('TimeFloor',RecNo())/60 as Minutos,

     peek('TimeFloor',RecNo()+1) - peek('TimeFloor',RecNo())/3600 as Horas,

     1 as contador

Resident TRANSACCIONES;

TimeFloor is the result of making a Floor () to a date format 'YY-MM-DD hh: mm: ss' and as a result I have numbers like this: 465465.6899074054

I don't know what formats are suitable for operation between dates and I also like to have these differences in numeric fields can get days, hours, minutes or seconds as a result for each difference between dates.


Any help would be very useful, thanks.

José.

Hola, estoy intentando crear columnas nuevas a medida que voy cargando las filas de una resident table con la diferencia entre la fecha de la fila siguiente con la fecha de la fila actual:

TIEMPO:

LOAD Tarjeta as ID_Tarjeta,

     peek('TimeFloor',RecNo()+1) - peek('TimeFloor',RecNo()) as Tiempo,

     peek('TimeFloor',RecNo()+1) - peek('TimeFloor',RecNo())/60 as Minutos,

     peek('TimeFloor',RecNo()+1) - peek('TimeFloor',RecNo())/3600 as Horas,

     1 as contador

Resident TRANSACCIONES;

TimeFloor es el resultado de hacer un Floor() a una fecha de formato 'YY-MM-DD hh:mm:ss' y como resultado tengo números de este estilo: 465465.6899074054

No sé cuáles son los formatos adecuados para operar entre fechas y además me gustaría poder tener esas diferencias en campos numéricos pudiendo obtener días, horas, minutos o segundos como resultado para cada diferencia entre fechas.

Cualquier ayuda sería de gran utilidad, gracias.

José.

1 Solution

Accepted Solutions
chematos
Specialist II
Specialist II
Author

Encontré la solución después de darle algunas vueltas

date(peek('TimeFloor',RecNo(),'TRANSACCIONES') -peek('TimeFloor',RecNo()-1,'TRANSACCIONES'),'hh:mm:ss')

La clave estaba en que RecNo() devuelve la posición de la siguiente fila a la actual, por lo que la resta tenía que hacerla entre RecNo() y RecNo()-1, ya que para la primera inserción, RecNo() devuelve un 2 y no un 1

Espero que le pueda servir a alguien para situaciones similares

Saludos

View solution in original post

4 Replies
jvitantonio
Luminary Alumni
Luminary Alumni

Fijate en esta aplicacion

Miguel_Angel_Baeyens

Hola José,

Un par de anotaciones sobre fechas en QlikView:

  • La fecha "0" equivale al 30/12/1899. La fecha "40966" equivale a 27/02/2012
  • Cuando una fecha tiene decimales, significa que el campo es una marca de tiempo que contiene día, mes, año pero también horas y minutos (y posiblemente segundos). Para QlikView, 24 horas es igual a 1. Así que "40966,75" equivaldría a "27/12/2012 18:00:00"

Dependiendo del análisis que quieras realizar necesitarás quedarte con la parte de fecha (entera) utilizando la función Ceil() o Floor(), y si quieres quedarte con la parte de la hora, tendrás que utilizar la función Frac().

Espero que te sirva.

Miguel

chematos
Specialist II
Specialist II
Author

Hola Miguel,

gracias por tu respuesta, siempre tan certeras.

He adjuntado una tabla execel con los resultados que me está dando al ejecutar este trozo de script:

LOAD  NoTarjeta, 

           FechaHora as F_Hora,

       peek('FechaHora',RowNo()+1,'TRANSACCIONES') - peek('FechaHora',RowNo(),'TRANSACCIONES') as  Tiempo,

Resident TRANSACCIONES

Order by NoTarjeta, TimeFloor ;

Parece funcionar pero necesitaría que los resultados de la columna 'Resultado actual' se puedan entender porque no estoy seguro de que los valores que me aparecen se correspondan con los tiempos que deberían ser.

También tengo otro problema y es tener en cuenta el cambio de 'NoTarjeta', puesto que la diferencia de tiempos tiene que separarse por tarjeta y por tanto no hacer la operación de resta al cambiar de una tarjeta a otra.

Como siempre, muchas gracias por vuestra ayuda.

Saludos

chematos
Specialist II
Specialist II
Author

Encontré la solución después de darle algunas vueltas

date(peek('TimeFloor',RecNo(),'TRANSACCIONES') -peek('TimeFloor',RecNo()-1,'TRANSACCIONES'),'hh:mm:ss')

La clave estaba en que RecNo() devuelve la posición de la siguiente fila a la actual, por lo que la resta tenía que hacerla entre RecNo() y RecNo()-1, ya que para la primera inserción, RecNo() devuelve un 2 y no un 1

Espero que le pueda servir a alguien para situaciones similares

Saludos