The bottom line
Six DAX time-intelligence patterns cover 90% of operations leadership questions. Implement them once in calculation groups, govern the semantic model, and stop maintaining 27 versions of YTD across reports. Standard pattern works on Fabric Direct Lake.
In This Article
- 1Question 1: What does "year" mean when your operation runs a 4-4-5 retail calendar?
- 2Question 2: How do shift-based plants reconcile production data with finance month-end?
- 3Question 3: When does OTIF YTD reset for a fiscal-year-aware buyer?
- 4Question 4: How do EPC projects roll up by milestone phase, not by month?
- 5Question 5: When does Direct Lake outperform Import for time-aware models?
- 6Question 6: When does Copilot in Power BI mis-quote a TOTALYTD figure?
- 7What this looks like in practice
- 8Where this approach doesn't fit
- 9Six weeks to first value
Introduction
Time-intelligence DAX is technically straightforward. TOTALYTD, SAMEPERIODLASTYEAR, DATESINPERIOD — the functions are well documented and widely understood. The failures are almost never about the function. They are about the calendar underneath it.
Build the right calendar table and the DAX is simple. Build the wrong one and every OTIF year-to-date figure is either early, late, or quietly wrong in a way nobody notices until the board meeting.
Here are the six questions that actually matter.
Question 1: What does "year" mean when your operation runs a 4-4-5 retail calendar?
For a manufacturer supplying into retail — a packaging group, an FMCG producer — the financial year is rarely January to December and almost never aligned with the Gregorian calendar in the way Power BI assumes by default.
A 4-4-5 calendar divides a fiscal year into 13 periods of 4, 4, and 5 weeks. Period boundaries do not fall on month-end dates. Quarter 1 of 2026 ends on a Saturday in late March — not on 31 March. If your date table is built on calendar months, your TOTALYTD for sales volume and your TOTALYTD for financial revenue will silently diverge the moment a 4-week period straddles a calendar month boundary.
The fix is not a DAX workaround. The fix is a fiscal calendar dimension table — with a Period column, a FiscalYear column, and a FiscalQuarter column that reflect how the business actually closes. Build that table once in Power Query, mark it as the date table, and every time-intelligence function in the model inherits the correct period definition.
The DAX for TOTALYTD on a fiscal calendar is then:
`TOTALYTD([Sales Volume], 'FiscalCalendar'[Date], "31/03")`
or, for a non-March year-end, whatever the correct fiscal year-end date is. The function is standard. The calendar doing the work underneath it is where most models break.
Question 2: How do shift-based plants reconcile production data with finance month-end?
A plant running three shifts — 06:00, 14:00, 22:00 — produces data that belongs to a shift, not to a calendar day. The night shift that starts at 22:00 on 31 March and ends at 06:00 on 01 April spans two financial periods.
SAP S/4HANA typically records production orders against the date the order was confirmed, not the date the shift started. SAP ByDesign may record differently depending on configuration. If your Power BI model joins the MES shift records to the SAP confirmation date without a reconciliation key, scrap rate and OEE figures will be mis-attributed across period boundaries — systematically, every month, at every shift that spans midnight on the last day of the period.
The semantic model fix: a ShiftDate dimension with a ShiftKey that links to the production order, separate from the CalendarDate key used for financial reporting. DAX measures need to be written explicitly for whichever grain the question is asking about — shift OEE, daily OEE, or period OEE — because the three are not interchangeable without the correct date dimension context.
This is a data model design question before it is a DAX question.
Question 3: When does OTIF YTD reset for a fiscal-year-aware buyer?
OTIF — On Time In Full — is measured against a promised delivery date. In a manufacturing-to-order context, the promised date is recorded in the sales order in SAP S/4HANA or SAP ByD at the time of order entry. The actual delivery date is recorded at goods issue.
The year-to-date OTIF figure means different things depending on whether "year" is the calendar year, the fiscal year, or the buyer's contracting period. For a retailer running a 4-4-5 fiscal year, OTIF resets at the start of their Period 1 — which may be a date in late January or early February, not 01 January.
If your Power BI model uses `TOTALYTD([OTIF Rate], 'Calendar'[Date])` without a fiscal year-end parameter, and your buyer's contracting period ends in March, the YTD figure your commercial director presents at the quarterly review is not the figure the buyer is measuring you against. The discrepancy is typically small in Q1 and grows through the year.
The correct pattern: define the fiscal year-end in the date table at model design time, not in the DAX measure at report design time. One definition, propagated everywhere.
Question 4: How do EPC projects roll up by milestone phase, not by month?
For an EPC business — Engineering, Procurement & Construction — the natural reporting period is a project milestone phase: design, procurement, civil, mechanical, commissioning. A project running from March 2025 to November 2026 does not produce meaningful month-by-month cost variance analysis. It produces meaningful phase-by-phase earned-value analysis.
Power BI time intelligence functions — TOTALYTD, DATEADD, PARALLELPERIOD — are built for calendar or fiscal period comparisons. They do not natively understand "compare Phase 2 actual cost to Phase 2 budget." That comparison requires a Phase dimension, not a date dimension, as the primary analytical axis.
The practical pattern: build a ProjectPhase dimension table with Phase start dates and end dates. Use those dates to filter fact table rows in DAX measures, rather than relying on TOTALYTD. The measure for Phase 2 cost variance is a CALCULATE with a DATESBETWEEN filter referencing the phase boundary dates — not a time-intelligence function at all.
This is a case where the standard time-intelligence toolkit is the wrong tool. Recognising that early saves weeks of rework.
Question 5: When does Direct Lake outperform Import for time-aware models?
Direct Lake mode in Power BI — reading directly from OneLake Delta Parquet without an Import refresh cycle — is the right choice for operational reporting when two conditions are met: the data volume is large enough that Import refresh takes more than 30–45 minutes, and the operational decision being made requires data that is current within hours, not days.
For an OEE dashboard that operations reviews at 06:00 every morning, Direct Lake means the figures reflect the ADF pipeline run from 03:00 — not the Import dataset that was last refreshed at 22:00 the previous evening. That 6–8 hour difference matters when a downtime event occurred at 01:30 and the floor supervisor needs to see it at shift start.
For a CFO reviewing quarterly financial performance, Import mode is often perfectly adequate. The finance dataset is large but not volatile — it changes once a day, at most. The refresh cost is worth paying for the query-performance consistency that Import provides for complex DAX over large aggregations.
The decision rule: Direct Lake for high-frequency operational metrics where data latency matters. Import for large financial models where query performance and DAX complexity matter more than real-time freshness. Most mid-market industrial estates need both, applied to different datasets, not a single mode chosen for everything.
Question 6: When does Copilot in Power BI mis-quote a TOTALYTD figure?
Copilot in Power BI will answer a question like "what is our OTIF year-to-date?" accurately — if the semantic model has a single, clearly defined OTIF measure and a correctly configured fiscal calendar table.
It will answer confidently but incorrectly in three common scenarios.
First: two OTIF measures exist — one for customer OTIF and one for internal OTIF — with similar names. Copilot selects one based on name proximity to the question. If the user expected the other, the answer is wrong.
Second: the date table is not marked as a date table in the semantic model. Copilot's time-intelligence interpretation depends on the model recognising which table is the calendar. Without the mark, TOTALYTD can resolve to an unexpected period boundary.
Third: the fiscal year-end is not encoded in the date table. Copilot's default assumption for "year-to-date" is the calendar year. If the business runs a March fiscal year-end and the date table does not encode that, Copilot's TOTALYTD answer will be for January-to-date, not April-to-date.
These are not Copilot failures. They are semantic model design failures that Copilot makes visible quickly. Fix the model, and Copilot becomes a genuinely fast interface for operations leaders who would otherwise need an analyst to write the DAX for them.
What this looks like in practice
A manufacturer running SAP S/4HANA in India had a Power BI model with seven TOTALYTD measures — each defined slightly differently, each used by a different report page, none documented. The analytics team spent 2–3 days per month reconciling figures before the leadership review.
The remediation work was not DAX-heavy. It was model architecture work: one fiscal calendar dimension table, one canonical OTIF measure, one canonical OEE measure, all others deprecated. Copilot in Power BI was then able to answer "what is our OEE year-to-date by plant?" correctly and consistently — because there was one answer to give.
Where this approach doesn't fit
Time intelligence is not a workaround for a missing master calendar. If the business does not have a defined fiscal year — or if different business units close on different dates — no DAX pattern will produce a consistent year-to-date figure. Fix the calendar definition first. Then write the DAX.
Similarly, if the SAP S/4HANA date dimension has not been extracted and modelled as a standalone dimension table — if dates exist only as raw timestamp fields in the fact table — the time-intelligence functions will work syntactically but will not honour fiscal periods. The dimension table is not optional.
Six weeks to first value
Discover: review the existing Power BI semantic models, identify the three most frequently disputed time-period comparisons, map the SAP S/4HANA or SAP ByD date fields in the source extract. Prototype: build one canonical fiscal calendar dimension, define one OTIF or OEE year-to-date measure, deliver one report page where the Operations Director and the CFO see the same figure. By week six, the reconciliation argument is resolved and the model is documented.
DAX time intelligence is mostly a maintenance problem disguised as a calculation problem. Calculation groups solve the maintenance. The six patterns cover the operational questions. Build them once, in one semantic model per domain, and stop arguing about whose YTD is right.
Free Assessment
Where does your operation sit on the data maturity curve?
8 questions. 3 minutes. You get a scored breakdown across data infrastructure, analytics readiness, and automation potential — with a specific next step for your industry.