¿Convertir rangos de fechas en una lista de fechas?

Un usuario Pregunto ✅

Dan80

Hola a todos, tengo una tabla con 2 columnas, fecha de inicio y fecha de finalización de las campañas de ventas, pero necesito convertir el rango en una lista de fechas, es decir, una columna de todas las fechas que hemos estado en venta. Alguna idea de como se puede hacer esto???

Marcel Beug

En respuesta a sean

En M se puede hacer de varias formas pero la más fácil sería:
– convertir las fechas de inicio y finalización en números,
– crear listas a partir de esos números,
– ampliar las listas y
– convertir los números a fechas

como se demuestra en este breve video.

Kasunpathirana

Wow @MarcelBeug El salvador, este es un gran truco. Gracias por esto

Si deseaba una solución DAX,

Asegúrese de tener una tabla de Fechas con una columna llamada Fecha

Luego puede crear la siguiente tabla si su tabla base se ve así:

Campaña Fecha de inicio Fecha de finalización

A 01/01/2017 17/01/2017
B 01/05/2017 01/12/2017

Campaigns Expanded = SELECTCOLUMNS(
                         FILTER(
                         CROSSJOIN('Campaigns',dates),
                         'Campaigns'[StartDate]<='Dates'[Date]
                         && 'Campaigns'[EndDate] >= 'Dates'[Date]
                         ),
                         "Campaign" , [Campaign] ,
                         "Active Date" , 'Dates'[Date])

Dan80

En respuesta a Phil_Seamark

Muchas gracias por tu ayuda, te lo agradezco

sean

En respuesta a Dan80

Hola, @Phil_Seamark, probé tu solución con esta muestra de datos.

CampañasInicioFin

A 1/1/2017 4/1/2017
B 10/01/2017 13/01/2017
C 2/3/2017 2/5/2017
D 22/02/2017 3/1/2017
mi 1/1/2017 3/1/2017

Con la solución de @MarcelBeug carita feliz tengo 79 filas

¡Mi forma de hacer esto con DAX también me da 79 filas!

(necesita una tabla de calendario que no esté conectada a la tabla de campañas)

Campaigns Table =
SUMMARIZE (
    GENERATE (
        Campaigns,
        CALCULATETABLE (
            VALUES ( 'Calendar Table'[Date] ),
            DATESBETWEEN ( 'Calendar Table'[Date], 'Campaigns'[Start], 'Campaigns'[End] )
        )
    ),
    'Calendar Table'[Date],
    'Campaigns'[Campaigns]
)

Su fórmula genera (3705 filas) ?

Campaigns Phil = 
SELECTCOLUMNS (
    FILTER (
        CROSSJOIN ( 'Campaigns', 'Calendar Table' ),
        'Campaigns'[Start] <= 'Calendar Table'[Date]
            && Campaigns[End] >= 'Calendar Table'[Date]
    ),
    "Campaign", [Campaigns],
    "Active Date", 'Calendar Table'[Date]
)

En respuesta a sean

Mmm, eso es raro. Acabo de probar y también tiene 79 filas. Puedo subir un archivo PBIX si está interesado.

También probé ambos enfoques en DaxStudio para verificar los tiempos y ver cuál era más rápido.

La consulta de @MarcelBeug tomó solo 8 ms para producir las 79 filas, mientras que mi enfoque tomó 39 ms para producir las 79 filas, por lo que creo que la función GENERATE es el camino a seguir 🙂

sean

En respuesta a Phil_Seamark

@Phil_Seamark¡Lo tengo! Vaya al Editor de consultas y aplique la solución de @MarcelBeug a la tabla Campañas original.

¡Luego mire la tabla creada con su fórmula desde 79 filas hasta 3,705 filas!

Sin embargo, TENGA EN CUENTA que la tabla GENERATE no se ve afectada por esto.

Estaba probando la solución de @MarcelBeug primero, luego agregué mi tabla GENERATE y luego la tuya en el mismo archivo en este orden.

carita feliz

¡Misterio resuelto! carita feliz

En respuesta a sean

Genial, estoy echando un vistazo más de cerca a los tiempos de los dos enfoques. La función GENERAR es más eficiente porque reduce el número de registros que lee de la tabla de fechas a solo los requeridos desde el principio, mientras que la función CROSS JOIN lee más de los necesarios y luego los descarta en la etapa de FILTRO.

Sin embargo, logré reducir el FILTRO CRUZADO a 5 ms haciendo esto …

my Table = 
var maxdate = max(Campaigns[End]) var mindate = min(Campaigns[Start]) var datesfiltered = CALCULATETABLE('Calendar Table', 'Calendar Table'[Date] <= maxdate && 'Calendar Table'[Date] >= mindate ) return SELECTCOLUMNS ( FILTER ( CROSSJOIN ( 'Campaigns', datesfiltered ), 'Campaigns'[Start] <= 'Calendar Table'[Date] && Campaigns[End] >= 'Calendar Table'[Date] ), "Campaign", [Campaigns], "Active Date", 'Calendar Table'[Date] )

sean

A juzgar por la respuesta que acabas de proporcionar en otra publicación, asumí que no quieres que esto se haga con DAX. carita feliz

Creo que he visto a @MarcelBeug hacer esto con M

Marcel Beug

En respuesta a sean

En M se puede hacer de varias formas pero la más fácil sería:
– convertir las fechas de inicio y finalización en números,
– crear listas a partir de esos números,
– ampliar las listas y
– convertir los números a fechas

como se demuestra en este breve video.

yashasvi

En respuesta a Marcel Beug

Tengo un rango de fechas que va en minutos con un incremento de 15 minutos. Cuando uso este método para convertir en números enteros. Quita los minutos y restablece cada fecha a las 12:00 AM. He intentado usar decimales en lugar de números enteros, pero sigo teniendo errores.

¿Podría proporcionar la solución si las fechas tienen minutos?

Dan80

En respuesta a yashasvi

Hola @yashasvi

Podrías dividir el proceso en dos. Convierta sus fechas en una lista primero usando {[Date From]..[Date To]}.

Luego, una vez que tenga esa lista, haga otra lista {[0]..[96]} esto representa los minutos, es decir, hay 96 * 15 minutos = 24 horas. Luego multiplique los minutos 0.0104166666666667, este es el resultado de =15/(24*60) que le dará el valor de día y minuto (en intervalos de 15 minutos).

Agregue la columna de fecha y minutos y cubra la fecha y la hora

Espero que ayude

yashasvi

En respuesta a Dan80

Gracias por la rápida respuesta @ Dan80. Cuando traté de usar su consulta M para manejar Fechas que tiene minutos. Está mostrando error. Tal vez porque cuando las fechas están en minutos, entonces necesita convertir las fechas en números decimales fijos y no en números enteros. Cuando apliqué su consulta M (que funciona perfectamente con números enteros) a los números decimales, no puede manejarlo. Traté de jugar con su consulta M y probé diferentes formatos antes [Date From]..[Date to] pero no pudo tener éxito.

¿Podría compartir la consulta M que puede manejar las fechas en minutos? Con eso me refiero a la consulta M que podría manejar el decimal (tal vez decimales fijos).

Saludos

Jmenas

En respuesta a Marcel Beug

¡@MarcelBeug muchas gracias por una solución realmente precisa y rápida!

Dan80

En respuesta a Marcel Beug

Sensacional, muchas gracias por tu ayuda!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *