📅

Funciones de Fecha y Hora

Trabaja con fechas, horas y duraciones usando Date.*, DateTime.*, Time.* y Duration.* en Power Query M.

Principiante Intermedio Avanzado
🆕

Crear Fechas

Date.From / #date

Principiante

Sintaxis

Date.From(value as any, optional culture as nullable text) as nullable date
#date(year as number, month as number, day as number) as date

¿Qué hace?

Crea un valor de tipo date. La literal #date es la forma más directa. Date.From convierte otros tipos (texto, número, datetime) a fecha.

Ejemplo

#date(2024, 1, 15)           // 2024-01-15
Date.From("2024-01-15")      // 2024-01-15
Date.From(45306)             // 2024-01-15 (número de serie Excel)
Date.From(DateTime.LocalNow()) // Fecha actual sin hora

DateTime.LocalNow / DateTime.FixedLocalNow

Principiante

Sintaxis

DateTime.LocalNow() as datetime
DateTime.FixedLocalNow() as datetime

¿Qué hace?

DateTime.LocalNow devuelve la fecha y hora actual del sistema. DateTime.FixedLocalNow devuelve la misma valor durante toda la ejecución de la consulta (no cambia si se llama varias veces).

Ejemplo

// Fecha de última actualización
Date.From(DateTime.LocalNow())

// Añadir columna con timestamp de carga
Table.AddColumn(tabla, "FechaCarga", each DateTime.LocalNow())
⚠️ Ojo con esto: DateTime.LocalNow usa la zona horaria del servidor de actualización, no la del usuario. En Power BI Service, el servidor puede estar en UTC. Considera usar DateTimeZone.LocalNow() si la zona horaria importa.
🎯

Extraer Partes de una Fecha

Date.Year / Date.Month / Date.Day

Principiante

Sintaxis

Date.Year(dateTime as nullable any) as nullable number
Date.Month(dateTime as nullable any) as nullable number
Date.Day(dateTime as nullable any) as nullable number

¿Qué hace?

Extrae el año, mes (1-12) o día (1-31) de una fecha. Funcionan con tipos date, datetime y datetimezone.

Ejemplo

Date.Year(#date(2024, 3, 15))   // 2024
Date.Month(#date(2024, 3, 15))  // 3
Date.Day(#date(2024, 3, 15))    // 15

// Crear columna de año fiscal (año fiscal empieza en octubre)
if Date.Month([Fecha]) >= 10
    then Date.Year([Fecha]) + 1
    else Date.Year([Fecha])

Date.QuarterOfYear / Date.WeekOfYear / Date.DayOfWeek

Intermedio

Sintaxis

Date.QuarterOfYear(dateTime as nullable any) as nullable number
Date.WeekOfYear(dateTime as nullable any, optional firstDayOfWeek as nullable number) as nullable number
Date.DayOfWeek(dateTime as nullable any, optional firstDayOfWeek as nullable number) as nullable number
Date.DayOfYear(dateTime as nullable any) as nullable number

¿Qué hace?

Extrae el trimestre (1-4), semana del año (1-53), día de la semana (0=domingo por defecto) o día del año (1-366).

Ejemplo

Date.QuarterOfYear(#date(2024, 7, 15))    // 3
Date.WeekOfYear(#date(2024, 3, 15))       // 11
Date.DayOfWeek(#date(2024, 3, 15))        // 5 (viernes, base domingo=0)
Date.DayOfWeek(#date(2024, 3, 15), Day.Monday)  // 4 (viernes, base lunes=0)
Date.DayOfYear(#date(2024, 3, 15))        // 75

// Nombre del día en español
Date.DayOfWeekName(#date(2024, 3, 15), "es-ES")   // "viernes"
Date.MonthName(#date(2024, 3, 15), "es-ES")        // "marzo"
⚙️

Operaciones con Fechas

Date.AddDays / Date.AddMonths / Date.AddYears

Principiante

Sintaxis

Date.AddDays(dateTime as nullable any, numberOfDays as number) as nullable any
Date.AddMonths(dateTime as nullable any, numberOfMonths as number) as nullable any
Date.AddYears(dateTime as nullable any, numberOfYears as number) as nullable any
Date.AddWeeks(dateTime as nullable any, numberOfWeeks as number) as nullable any

¿Qué hace?

Suma (o resta si el número es negativo) días, meses, años o semanas a una fecha. Maneja automáticamente los cambios de mes y año.

Ejemplo

Date.AddDays(#date(2024, 1, 30), 5)    // 2024-02-04
Date.AddMonths(#date(2024, 1, 31), 1)  // 2024-02-29 (2024 es bisiesto)
Date.AddYears(#date(2024, 2, 29), 1)   // 2025-02-28 (ajusta automáticamente)

// Calcular fecha de vencimiento 30 días después
Date.AddDays([FechaFactura], 30)

Date.From — Diferencia entre fechas

Intermedio

Sintaxis

// La resta de fechas en M devuelve una Duration
fecha2 - fecha1 as duration
Duration.Days(duration as nullable duration) as nullable number

¿Qué hace?

En M, restar dos fechas devuelve una duration. Para obtener el número de días, usa Duration.Days. Para meses y años exactos, usa Date.Year/Date.Month con aritmética.

Ejemplo

// Días entre dos fechas
Duration.Days(#date(2024, 12, 31) - #date(2024, 1, 1))
// 365

// Edad en años (aproximada)
Number.RoundDown(
    Duration.Days(Date.From(DateTime.LocalNow()) - [FechaNacimiento]) / 365.25
)

// Días hasta vencimiento
Duration.Days([FechaVencimiento] - Date.From(DateTime.LocalNow()))

Date.StartOfMonth / Date.EndOfMonth

Intermedio

Sintaxis

Date.StartOfMonth(dateTime as nullable any) as nullable any
Date.EndOfMonth(dateTime as nullable any) as nullable any
Date.StartOfQuarter / Date.EndOfQuarter
Date.StartOfYear / Date.EndOfYear
Date.StartOfWeek / Date.EndOfWeek

¿Qué hace?

Devuelve el primer o último día del período (mes, trimestre, año, semana) que contiene la fecha dada. Muy útil para crear tablas de calendario y calcular períodos.

Ejemplo

Date.StartOfMonth(#date(2024, 3, 15))  // 2024-03-01
Date.EndOfMonth(#date(2024, 3, 15))    // 2024-03-31
Date.StartOfYear(#date(2024, 7, 20))   // 2024-01-01
Date.EndOfQuarter(#date(2024, 7, 20))  // 2024-09-30

// Filtrar el mes actual completo
Table.SelectRows(tabla, each
    [Fecha] >= Date.StartOfMonth(Date.From(DateTime.LocalNow())) and
    [Fecha] <= Date.EndOfMonth(Date.From(DateTime.LocalNow()))
)
💡 Tip kawaii: La combinación de Date.StartOfMonth y Date.EndOfMonth es la base para crear filtros de "mes en curso", "mes anterior" y otros períodos relativos sin depender de fechas hardcodeadas.
🕐

DateTime — Fecha y Hora Combinadas

DateTime.From / #datetime

Intermedio

Sintaxis

#datetime(year, month, day, hour, minute, second) as datetime
DateTime.From(value as any, optional culture as nullable text) as nullable datetime
DateTime.Date(dateTime as nullable datetime) as nullable date
DateTime.Time(dateTime as nullable datetime) as nullable time

¿Qué hace?

Crea valores datetime combinando fecha y hora. DateTime.Date extrae sólo la parte de fecha y DateTime.Time sólo la parte de hora.

Ejemplo

#datetime(2024, 3, 15, 14, 30, 0)   // 2024-03-15 14:30:00

// Separar fecha y hora de un campo datetime
DateTime.Date([FechaHora])   // 2024-03-15
DateTime.Time([FechaHora])   // 14:30:00

// Truncar a inicio del día
DateTime.From(Date.From([FechaHora]))

Time — Hora

Time.Hour / Time.Minute / Time.Second

Principiante

Sintaxis

#time(hour, minute, second) as time
Time.Hour(time as nullable any) as nullable number
Time.Minute(time as nullable any) as nullable number
Time.Second(time as nullable any) as nullable number

¿Qué hace?

Crea y extrae componentes de valores de hora. Útil para analizar datos de timestamps y calcular duraciones intradiarias.

Ejemplo

#time(14, 30, 45)        // 14:30:45
Time.Hour(#time(14, 30, 45))    // 14
Time.Minute(#time(14, 30, 45))  // 30
Time.Second(#time(14, 30, 45))  // 45

// Clasificar por turno
if Time.Hour([HoraEntrada]) < 8 then "Madrugada"
else if Time.Hour([HoraEntrada]) < 14 then "Mañana"
else if Time.Hour([HoraEntrada]) < 22 then "Tarde"
else "Noche"

Duration — Duraciones

Duration.* — Trabajar con duraciones

Intermedio

Sintaxis

#duration(days, hours, minutes, seconds) as duration
Duration.Days(duration as nullable duration) as nullable number
Duration.Hours(duration as nullable duration) as nullable number
Duration.Minutes(duration as nullable duration) as nullable number
Duration.Seconds(duration as nullable duration) as nullable number
Duration.TotalDays(duration as nullable duration) as nullable number
Duration.TotalHours(duration as nullable duration) as nullable number
Duration.TotalMinutes(duration as nullable duration) as nullable number
Duration.TotalSeconds(duration as nullable duration) as nullable number

¿Qué hace?

Las funciones Duration.* extraen la parte de la duración (ej. Duration.Hours = 0-23). Las funciones Duration.Total* convierten la duración completa a esa unidad.

Ejemplo

let dur = #duration(2, 5, 30, 0)  // 2 días, 5 horas, 30 min
in [
    dias    = Duration.Days(dur),         // 2
    horas   = Duration.Hours(dur),        // 5
    minutos = Duration.Minutes(dur),      // 30
    total_horas = Duration.TotalHours(dur)  // 53.5 horas totales
]

// Tiempo de resolución de tickets
let duracion = [FechaCierre] - [FechaApertura]
in Duration.TotalHours(duracion)
💡 Tip kawaii: Duration.TotalHours vs Duration.Hours: si tienes una duración de 25 horas, Duration.Hours devuelve 1 (la parte de horas del día 1) mientras que Duration.TotalHours devuelve 25. ¡No las confundas!
🔄

Conversión y Formato

Date.ToText / DateTime.ToText

Intermedio

Sintaxis

Date.ToText(date as nullable date, optional options as any, optional culture as nullable text) as nullable text
DateTime.ToText(dateTime as nullable datetime, optional options as any, optional culture as nullable text) as nullable text

¿Qué hace?

Convierte una fecha o datetime a texto con el formato especificado. Usa patrones de formato .NET: "yyyy-MM-dd", "dd/MM/yyyy", "MMMM yyyy", etc.

Ejemplo

Date.ToText(#date(2024, 3, 15), "dd/MM/yyyy")
// "15/03/2024"

Date.ToText(#date(2024, 3, 15), "MMMM yyyy", "es-ES")
// "marzo 2024"

Date.ToText(#date(2024, 3, 15), "yyyy-MM-dd")
// "2024-03-15" (formato ISO)

DateTime.ToText(DateTime.LocalNow(), "dd/MM/yyyy HH:mm")
// "15/03/2024 14:30"
📌 Buena práctica: Para columnas clave (joins, tablas de calendario), usa siempre el formato ISO "yyyy-MM-dd". Para columnas de visualización, usa el formato local con la cultura adecuada.
🚀 ¡Dominas las fechas! Ahora explora las Expresiones Lógicas para controlar el flujo de tus consultas M.