¿Cómo realizar un DATEDIFF para POWER QUERY? El código para crear su función de Power Query personalizada se encuentra en este artículo.
- Copia el código de las 5 funciones
- Pégalos en 5 funciones personalizadas
- Llamar a la función DATEDIF personalizada
Copia cada código en una consulta diferente.
Para cada código siguiente, debe escribirlos en una consulta en blanco (Obtener datos > De otra fuente > Consulta en blanco)
Y pegarás los códigos en el editor de Power Query (Inicio > Editor avanzado)
El código de función DATEDIFF para Power Query
Los siguientes códigos devuelven las cinco opciones de la Función DATEDIFF (a, m, d, am, md).
Función fn_D
Este es el parámetro más fácil de construir.
(date1, date2) =>
let
Source = Duration.Days(date2 - date1)
in
Source
Función fn_Y
Acabo de aplicar los pasos estándar de Power Query para calcular el número de años.
- Diferencia entre las 2 fechas en días
- Convertir el tipo de la columna a Duración
- Devuelve el duración en años
(date1, date2) =>
let
Source = Duration.Days(date2 - date1),
TheDuration = (Duration.TotalDays(Duration.From(Source)) / 365),
YearResult = Number.RoundDown(TheDuration)
in
YearResult
Función fn_YM
Luego, calculamos el número de meses del año actual (parámetro YM). Aquí debemos considerar si el día y el mes son mayores o menores entre las 2 fechas.
(date1, date2)=>
let
GapDay = Date.Day(date2) - Date.Day(date1),
GapMonth = Date.Month(date2) - Date.Month(date1),
NbMonth = if GapDay < 0 then GapMonth - 1 else GapMonth,
YM = if NbMonth < 0 then (12 + NbMonth) else NbMonth
in
YM
Función fn_MD
Aquí, devuelvo el número de días del mes actual (MD) y hay una diferencia con la función DATEDIF de Excel.
La lógica aquí es 'construir' una fecha con el último día del mes del fecha1. Si el primer día es menor que el segundo día, simplemente resto los 2 valores. Pero si Day1 es mayor, entonces calculo la diferencia entre el último día del mes y fecha1 y finalmente sumar el número de Day2
(date1, date2)=>
let
Day1 = Date.Day(date1),
Day2 = Date.Day(date2),
DayEndMonth = Date.Day(Date.EndOfMonth(date1)),
MD = if Day1 <= Day2 then Day2 - Day1 else (DayEndMonth-Day1)+Day2
in
MD
Función fn_M
Para calcular el número de meses entre las 2 fechas, Necesito llamar a la función fn_Y y multiplicar por 12, y luego agregar el resultado de la función fn_YM.
(date1, date2) =>
let
Step1 = fn_Y(date1, date2)*12,
Step2 = Step1 + fn_YM(date1, date2)
in
Step2
Función fn_YD
Aquí nuevamente podría haber una diferencia con la función DATEDIF pero este parámetro prácticamente nunca se usa (yo lo usé una vez en 20 años). De todos modos, la lógica aquí es construir una fecha con el año de fecha2 y el día y el mes de fecha1. Si la nueva fecha es mayor que la fecha2, reconstruyo una fecha del año anterior. Finalmente, solo necesito restar las 2 fechas para devolver el número de días del año.
(date1, date2)=>
let
Year2 = Date.Year(date2),
BuildDate = #date(Year2, Date.Month(date1), Date.Day(date1)),
TestNewDate = if BuildDate <= date2
then BuildDate
else #date(Year2 - 1, Date.Month(date1), Date.Day(date1)),
YD = Duration.Days(date2 - TestNewDate)
in
YD
FECHA SI para CONSULTA DE ENERGÍA
Finalmente, incluyo todas estas funciones dentro de otra función de Power Query llamada fn_DateDif
(date1, date2, ParamDate)=>
let
ValParam = Text.Upper(ParamDate),
ResultFunction = if ValParam = "D" then fn_D(date1, date2)
else if ValParam = "Y" then fn_Y(date1, date2)
else if ValParam = "M" then fn_M(date1, date2)
else if ValParam = "YM" then fn_YM(date1, date2)
else if ValParam = "MD" then fn_MD(date1, date2)
else if ValParam = "YD" then fn_YD(date1, date2)
else "Wrong parameter"
in
ResultFunction
Cuando hayas copiado todos los códigos, tendrás esto.
Aplicación en Excel
Ahora en Power Query, debe llamar a la función con el menú Agregar columna> Invocar función personalizada.
Entonces llamas al fn_DateDiff función y complete los tres parámetros, como se muestra en este ejemplo.
Y cuando cargas los datos en Excel, tienes este resultado.
La diferencia con la función DADOSI de Excel
Al probar la función Power Query con la función Excel, el parámetro 'MD' producirá resultados diferentes.
Esto se debe a que la lógica utilizada para calcular este parámetro difiere de la de Excel. En el primer ejemplo, Excel suma 12 años y 3 meses a la primera fecha. Por lo tanto, la "nueva fecha" es el 22/05/2017. En este caso, 09/06/2017 - 22/05/2017 = 18 días. La diferencia podría explicarse por... el número de años bisiestos.

05/11/2024 a las 09:25
Hola Frederic,
Lo intenté, pero en mi caso la función fn_YD dice 366 si la primera fecha es el 25 de junio de 1954 y la segunda fecha es el 2 de junio de 25
05/11/2024 a las 10:51
Gracias por el comentario. Verificaré la función de inmediato.
05/11/2024 a las 13:32
Vale, es una actualización. En lugar de BuildDate < date2, he actualizado la prueba lógica BuildDate <= date2