Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
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.
Espero que te sirva de ayuda.
Un saludo.
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.
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
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.
Espero que te sirva de ayuda.
Un saludo.
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:
Si tienes alguna duda, siéntete libre de preguntar.
Un saludo.
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
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.
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