Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Aitana
Contributor
Contributor

Master calendar que genere intervalos de 10 minutos

Hola, estoy intentado crear un Master calendar que genere intervalos de 10 min entre una fecha de inicio y una fecha fin concretas, Como podría hacerlo?

 

Gracias

Labels (1)
2 Solutions

Accepted Solutions
Happy_Mask_Salesman
Partner - Contributor III
Partner - Contributor III

Buenos días Aitana.

¿Entiendo que necesitarías un registro de timestamp cada diez minutos en el calendario maestro?

Por ejemplo, una fila con un valor "17/10/2023 13:00", tendría como siguiente registro "17/10/2023 13:10" y el siguiente registro "17/10/2023 13:20".

Aviso: esto te crearía muchos registros por día, 10min cada hora son 6 filas por hora, por 24h cada día, 144 filas por día.

Si quisieras hacerlo así, podemos basarnos en una solución que propuso el compañero @sunny_talwar en otro post similar donde se pedía lo mismo, pero por hora (https://community.qlik.com/t5/QlikView-App-Dev/Master-Calendar-With-Hour/td-p/1363340). Con adaptar esta solución a intervalos de diez minutos bastaría.

Esta es mi adaptación por intervalos de diez minutos, basado en dos fechas indicadas en las variables vFechaMinima y vFechaMaxima, por ejemplo, desde ayer hasta hoy a las 12 de la noche.

LET vFechaMinima = Num(Timestamp(Timestamp#('17/10/2023 00:00:00','DD/MM/YYYY hh:mm:ss')));
LET vFechaMaxima = Num(Timestamp(Timestamp#('19/10/2023 00:00:00','DD/MM/YYYY hh:mm:ss')));

LET vDias = vFechaMaxima - vFechaMinima ;

Calendario:
LOAD
Year(FechaCompleta) AS Año,
Date(MonthName(FechaCompleta),'MMM/YYYY') AS MesAño,
Month(FechaCompleta) AS Mes,
Day(FechaCompleta) AS Dia,
Date(Floor(Date(FechaCompleta,'DD/MM/YYYY')),'DD/MM/YYYY') AS Fecha,
Hour(FechaCompleta) AS Hora,
Timestamp (FechaCompleta) AS FechaCompleta;
LOAD
Timestamp($(vFechaMinima) + (RecNo()-1)/24/6) as FechaCompleta
AUTOGENERATE 6*24 * $(vDias) + 1;

Echa un vistazo. En el AUTOGENERATE, calculamos cuántos días vamos a generar, en este caso 1 día (de ayer a hoy), multiplicaremos por número de horas de un día, 24h por intervalos de diez minutos, seis veces para cada hora.

Esta tabla sería el resultado.

Happy_Mask_Salesman_0-1697542758736.png

Espero que te sirva de ayuda.

Un saludo.

View solution in original post

Happy_Mask_Salesman
Partner - Contributor III
Partner - Contributor III

Vamos a simplificar mejor las variables, pues ese código lo había copiado de otro compañero. Si quisiéramos decirle que la fecha mínima sea el 17/10/2023 y la máxima el 19/10/2023, va a ser más sencillo hacer esto:

LET vFechaMinima = Timestamp(MakeDate(2023, 10, 17));
LET vFechaMaxima = Timestamp(MakeDate(2023, 10, 19));

Lo primero que hacemos es crear una fecha utilizando la función MakeDate(), el primer parámetro es el año, el segundo, el mes y el tercero, el día.

Posteriormente convertimos la fecha a timestamp, que es la fecha completa, con la función Timestamp(). Como no le hemos indicado la hora, automáticamente le asocia las 00:00:00.

Happy_Mask_Salesman_0-1697631154438.png

 

Juraría que además en tu caso falla por varias razones:

- Has olvidado indicar el mes, entre el año y el día.

- La función Date() sirve para dar un formato de fecha a un número interno que se pueda representar como una fecha. En este caso sobra.

Para convertir de YYYYMMDDHHMM a formato legible, utiliza:

Timestamp(Timestamp#(202310170000, 'YYYYMMDDhhmm'))

Esta fórmula te convierte 202310170000 en 17/10/2023 0:00:00.

Espero que te haya servido, si es correcto, marca la respuesta como solución.


Un saludo

View solution in original post

4 Replies
Happy_Mask_Salesman
Partner - Contributor III
Partner - Contributor III

Buenos días Aitana.

¿Entiendo que necesitarías un registro de timestamp cada diez minutos en el calendario maestro?

Por ejemplo, una fila con un valor "17/10/2023 13:00", tendría como siguiente registro "17/10/2023 13:10" y el siguiente registro "17/10/2023 13:20".

Aviso: esto te crearía muchos registros por día, 10min cada hora son 6 filas por hora, por 24h cada día, 144 filas por día.

Si quisieras hacerlo así, podemos basarnos en una solución que propuso el compañero @sunny_talwar en otro post similar donde se pedía lo mismo, pero por hora (https://community.qlik.com/t5/QlikView-App-Dev/Master-Calendar-With-Hour/td-p/1363340). Con adaptar esta solución a intervalos de diez minutos bastaría.

Esta es mi adaptación por intervalos de diez minutos, basado en dos fechas indicadas en las variables vFechaMinima y vFechaMaxima, por ejemplo, desde ayer hasta hoy a las 12 de la noche.

LET vFechaMinima = Num(Timestamp(Timestamp#('17/10/2023 00:00:00','DD/MM/YYYY hh:mm:ss')));
LET vFechaMaxima = Num(Timestamp(Timestamp#('19/10/2023 00:00:00','DD/MM/YYYY hh:mm:ss')));

LET vDias = vFechaMaxima - vFechaMinima ;

Calendario:
LOAD
Year(FechaCompleta) AS Año,
Date(MonthName(FechaCompleta),'MMM/YYYY') AS MesAño,
Month(FechaCompleta) AS Mes,
Day(FechaCompleta) AS Dia,
Date(Floor(Date(FechaCompleta,'DD/MM/YYYY')),'DD/MM/YYYY') AS Fecha,
Hour(FechaCompleta) AS Hora,
Timestamp (FechaCompleta) AS FechaCompleta;
LOAD
Timestamp($(vFechaMinima) + (RecNo()-1)/24/6) as FechaCompleta
AUTOGENERATE 6*24 * $(vDias) + 1;

Echa un vistazo. En el AUTOGENERATE, calculamos cuántos días vamos a generar, en este caso 1 día (de ayer a hoy), multiplicaremos por número de horas de un día, 24h por intervalos de diez minutos, seis veces para cada hora.

Esta tabla sería el resultado.

Happy_Mask_Salesman_0-1697542758736.png

Espero que te sirva de ayuda.

Un saludo.

Happy_Mask_Salesman
Partner - Contributor III
Partner - Contributor III

Buenas tardes Aitana.

Había escrito una respuesta y no se ha publicado.

Entiendo que necesitas un calendario maestro que genere registros cada diez minutos desde una fecha a otra.
Existe un post similar donde piden generar un calendario maestro por horas. (https://community.qlik.com/t5/QlikView-App-Dev/Master-Calendar-With-Hour/td-p/1363340)


Este script está basado en la solución propuesta por el compañero @sunny_talwar, te lo voy a adaptar a tu caso.

Definimos una fecha de inicio y otra de fin (vFechaMaxima y vFechaMinima). En este ejemplo estoy cogiendo el intervalo de entre hoy, 17 de octubre y mañana, 18 de octubre. Puedes configurar estas variables para tu caso.

LET vFechaMinima = Num(Timestamp(Timestamp#('17/10/2023 00:00:00','DD/MM/YYYY hh:mm:ss')));
LET vFechaMaxima = Num(Timestamp(Timestamp#('19/10/2023 00:00:00','DD/MM/YYYY hh:mm:ss')));

LET vDias = vFechaMaxima - vFechaMinima ;

Calendario:
LOAD
Year(FechaCompleta) AS Año,
Date(MonthName(FechaCompleta),'MMM/YYYY') AS MesAño,
Month(FechaCompleta) AS Mes,
Day(FechaCompleta) AS Dia,
Date(Floor(Date(FechaCompleta,'DD/MM/YYYY')),'DD/MM/YYYY') AS Fecha,
Hour(FechaCompleta) AS Hora,
Timestamp (FechaCompleta) AS FechaCompleta;
LOAD
Timestamp($(vFechaMinima) + (RecNo()-1)/24/6) as FechaCompleta
AUTOGENERATE 6*24 * $(vDias) + 1;

Primero calculamos el número de días que abarcará el calendario. Por cada día, multiplicaremos 24, que son las horas que tiene un día, y  más tarde multiplicaremos por seis, que es el nº de veces que pasan 10 minutos en una hora.

Posteriormente, fíjate en el primer cálculo de la FechaCompleta.

Se suma a la fecha mínima, el nº de la fila, dividido entre 24h y 6 intervalos por cada hora.

Aviso: Esto te va a dar 144 registros por día. Si lo haces para un año completo, 144 x 365 = 52.560 filas en el calendario. Podría afectar al rendimiento de tu aplicación.

Después aplicaremos las transformaciones (cuando trabajamos con LOAD precedentes, se ejecuta el último primero, y luego el siguiente, que es el anterior).

La tabla resultante será esta:

Happy_Mask_Salesman_0-1697550736382.png

Si tienes alguna duda, siéntete libre de preguntar.

Un saludo.

 

 

Aitana
Contributor
Contributor
Author

Me funciona genial! Muchas gracias!

Una última cuestión,  mis fechas inicio y fin tienen el siguiente formato 'YYYYMMDDHHMM'

Y las he definido:
LET vFechaMinima = Num(Timestamp(Timestamp#('Date(2023170000, 'YYYYMMDDHHMM'),'DD/MM/YYYY hh:mm')));
LET vFechaMaxima = Num(Timestamp(Timestamp#(Date(2023190000, 'YYYYMMDDHHMM'),'DD/MM/YYYY hh:mm')));

Pero con ese cambio el calendario se me inicia en el año 1900 

Happy_Mask_Salesman
Partner - Contributor III
Partner - Contributor III

Vamos a simplificar mejor las variables, pues ese código lo había copiado de otro compañero. Si quisiéramos decirle que la fecha mínima sea el 17/10/2023 y la máxima el 19/10/2023, va a ser más sencillo hacer esto:

LET vFechaMinima = Timestamp(MakeDate(2023, 10, 17));
LET vFechaMaxima = Timestamp(MakeDate(2023, 10, 19));

Lo primero que hacemos es crear una fecha utilizando la función MakeDate(), el primer parámetro es el año, el segundo, el mes y el tercero, el día.

Posteriormente convertimos la fecha a timestamp, que es la fecha completa, con la función Timestamp(). Como no le hemos indicado la hora, automáticamente le asocia las 00:00:00.

Happy_Mask_Salesman_0-1697631154438.png

 

Juraría que además en tu caso falla por varias razones:

- Has olvidado indicar el mes, entre el año y el día.

- La función Date() sirve para dar un formato de fecha a un número interno que se pueda representar como una fecha. En este caso sobra.

Para convertir de YYYYMMDDHHMM a formato legible, utiliza:

Timestamp(Timestamp#(202310170000, 'YYYYMMDDhhmm'))

Esta fórmula te convierte 202310170000 en 17/10/2023 0:00:00.

Espero que te haya servido, si es correcto, marca la respuesta como solución.


Un saludo