Time intelligence is model design plus DAX — not DAX alone.
Complete 12 of 24 practices (50%) and enter your name to unlock the Certificate of Participation.
Advanced time intelligence begins with model design. A proper date table gives the model one consistent place for year, quarter, month, week, fiscal attributes and period ordering.
The same KPI can appear correct by month and wrong by fiscal quarter if dates, sort columns or relationships are inconsistent.
DimDate =
ADDCOLUMNS(
CALENDAR(DATE(2024,1,1), DATE(2027,12,31)),
"Year", YEAR([Date]),
"MonthNumber", MONTH([Date]),
"MonthName", FORMAT([Date], "MMMM"),
"YearMonth", FORMAT([Date], "YYYY-MM")
)
Treat the date table as shared analytical infrastructure, not as a helper column.
Period-to-date measures accumulate values from the beginning of a defined period through the current filter context. They are simple to write but only trustworthy when the date model is trustworthy.
A YTD measure may be one line long, but the business still needs to know: Which year? Calendar or fiscal? What happens on Jan 1? What happens when no date is selected?
Sales = SUM(FactSales[SalesAmount])
Sales MTD =
CALCULATE(
[Sales],
DATESMTD('DimDate'[Date])
)
Sales QTD =
CALCULATE(
[Sales],
DATESQTD('DimDate'[Date])
)
Sales YTD =
TOTALYTD(
[Sales],
'DimDate'[Date]
)
Period-to-date calculations should extend a validated base measure, not reimplement business logic repeatedly.
Year-over-year analysis compares the current filter context with a shifted context. The measure is not looking up a fixed prior-year number; it is re-evaluating the same business measure over a different set of dates.
If [Sales] already contains the correct business logic, [Sales LY] should shift the date context and reuse [Sales].
Sales LY =
CALCULATE(
[Sales],
SAMEPERIODLASTYEAR('DimDate'[Date])
)
Sales YoY Δ =
[Sales] - [Sales LY]
Sales YoY % =
DIVIDE(
[Sales] - [Sales LY],
[Sales LY]
)
A strong YoY measure compares equivalent periods, not simply two annual totals with different coverage.
Rolling periods answer questions such as 'What happened over the last 12 months from this point?' instead of resetting on January 1. They are especially useful for trend, seasonality and operational performance.
A December-to-January transition can make YTD collapse from twelve months to one month. Rolling 12 stays focused on the most recent twelve-month window.
Sales Rolling 12M =
VAR EndDate =
MAX('DimDate'[Date])
RETURN
CALCULATE(
[Sales],
DATESINPERIOD(
'DimDate'[Date],
EndDate,
-12,
MONTH
)
)
Rolling windows should be named with both horizon and grain so users know exactly what 'rolling' means.
Financial and operational reporting often uses fiscal periods that start in a month other than January. The date table should model those periods explicitly instead of forcing every measure to reconstruct fiscal logic.
If fiscal year starts in October, then October 2026 may belong to FY2027. That mapping should be visible and testable in DimDate.
-- Example: fiscal year begins in October
FiscalYear =
YEAR(
EDATE('DimDate'[Date], 3)
)
FiscalMonthNumber =
MOD(MONTH('DimDate'[Date]) + 2, 12) + 1
-- Validate against the organization's
-- official fiscal calendar.
Fiscal time intelligence is a modeling agreement with the business before it is a DAX problem.
A single fact row can have several meaningful dates. Power BI usually has one active relationship between two tables, while additional date-role relationships can remain inactive and be activated inside measures with USERELATIONSHIP.
A sales dashboard may filter most measures by OrderDate but still need a shipped-sales measure by ShipDate. USERELATIONSHIP lets the measure state that intent explicitly.
Orders =
COUNTROWS(FactOrders)
Orders Shipped =
CALCULATE(
COUNTROWS(FactOrders),
USERELATIONSHIP(
'DimDate'[Date],
FactOrders[ShipDate]
)
)
A date role should be explicit in both model relationships and measure names.
Calendar days are not always business days. Service-level, operations and workforce reporting often need holiday flags, workday sequence numbers or other custom time attributes.
If Friday is followed by Monday, a previous-day comparison should often jump across the weekend. A workday sequence in DimDate makes that rule explicit.
DimDate columns:
Date
DayOfWeek
IsWeekend
IsHoliday
IsWorkday
BusinessDayIndex
FiscalYear
FiscalPeriod
Measures can then compare
business periods instead of raw calendar dates.
Advanced time intelligence becomes more reliable when business calendars are modeled once and reused everywhere.
Time calculations become production-grade when the period definition is explicit, date coverage is complete, business calendars are modeled centrally, and every comparison can be reconciled to known totals.
A beautiful YoY line is useless if one year includes 12 months and the other includes 9. Equivalent-period validation matters more than visual smoothness.
1. Is DimDate complete and unique?
2. Are month / fiscal labels sorted correctly?
3. Which date relationship is active?
4. Are alternate date roles documented?
5. Does YTD reset at the intended boundary?
6. Does YoY compare equivalent periods?
7. Are rolling windows anchored correctly?
8. Are holidays / workdays modeled?
9. Are fiscal totals reconciled?
10. Are partial periods handled intentionally?
11. Have missing prior periods been tested?
12. Are new preview features isolated and validated?
The strongest time intelligence is transparent: users can explain exactly which dates each measure includes.
Open each item after answering it in your own words. The 24 interactive practices above drive certificate progress.
A properly designed date/calendar model.
The business logic stays the same while the date context changes.
A moving 12-month window anchored to the current context.
It activates an alternate relationship inside a measure.
Business time can differ from standard calendar time.
| Layer | Purpose |
|---|---|
| DimDate / Calendar | Defines calendar, fiscal and workday structure |
| Base Measure | Contains the business calculation |
| Period-to-Date | MTD / QTD / YTD |
| Prior Period | Previous month / year / equivalent period |
| Rolling / Fiscal | Moving windows and non-calendar business periods |
Complete at least 12 of the 24 practice cases (50%) and enter your name.
This training is aligned to current Microsoft Learn guidance for Power BI date tables and DAX time intelligence.