Create and Use Custom Date Tables in Power BI for Date Hierarchies
By default, Power BI creates a date hierarchy based on the date data in the model. While this default hierarchy works in many cases, it can lead to unexpected results in some visualizations. Custom date tables in Power BI give you more control over date hierarchies, allowing you to customize the behavior, calculations, and formatting of date dimensions.
Instructions
Step 1: Create Date Table Using Power Query
In this example, we use Power Query to generate the date table, though you can also create it using a DAX expression in Power BI.
- From the
Home
ribbon, clickGet Data
and selectBlank Query
. - The Power Query Editor will open a new blank query.
- In the Power Query Editor, click
Advanced Editor
on theHome
ribbon, then add the following code. - Adjust the
StartDate
andEndDate
variables to match the date range needed for your report. - Click
Done
to close the Advanced Editor. - After returning to the Power Query Editor, rename the table in the
Query Settings
pane underPROPERTIES
. I’ve named itTBL_PQ_DATE_TABLE
.
let
StartDate = #date(2025, 1, 1),
EndDate = #date(2025, 12, 31),
DateList = List.Dates(StartDate, Number.From(EndDate) - Number.From(StartDate) + 1, #duration(1,0,0,0)),
#"Converted to Table" = Table.FromList(DateList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "DATE"}}),
#"Add Column YEAR" = Table.AddColumn(#"Renamed Columns", "YEAR", each Date.Year([DATE])),
#"Add Column QUARTER" = Table.AddColumn(#"Add Column YEAR", "QUARTER", each Date.QuarterOfYear([DATE])),
#"Add Column MONTH" = Table.AddColumn(#"Add Column QUARTER", "MONTH", each Date.Month([DATE])),
#"Add Column DAY" = Table.AddColumn(#"Add Column MONTH", "DAY", each Date.Day([DATE])),
#"Add Column QUARTER_LABEL" = Table.AddColumn(#"Add Column DAY", "QUARTER_LABEL", each "Q" & Number.ToText([QUARTER])),
#"Add Column MONTH_LABEL" = Table.AddColumn(#"Add Column QUARTER_LABEL", "MONTH_LABEL", each Date.ToText([DATE],"MMM")),
#"Add Column DAY_LABEL" = Table.AddColumn(#"Add Column MONTH_LABEL", "DAY_LABEL", each Date.ToText([DATE],"ddd")),
#"Add Column DAY_OF_WEEK" = Table.AddColumn(#"Add Column DAY_LABEL", "DAY_OF_WEEK", each Date.DayOfWeek([DATE])),
#"Add Column YEAR_QUARTER_LABEL" = Table.AddColumn(#"Add Column DAY_OF_WEEK", "YEAR_QUARTER_LABEL", each Number.ToText([YEAR]) & " " & [QUARTER_LABEL]),
#"Add Column YEAR_MONTH_LABEL" = Table.AddColumn(#"Add Column YEAR_QUARTER_LABEL", "YEAR_MONTH_LABEL", each Number.ToText([YEAR]) & " " & [MONTH_LABEL]),
#"Add Column SORT_YEAR_QUARTER" = Table.AddColumn(#"Add Column YEAR_MONTH_LABEL", "SORT_YEAR_QUARTER", each Number.ToText([YEAR]) & Text.PadStart(Number.ToText([QUARTER]),2,"0")),
#"Add Column SORT_YEAR_QUARTER_MONTH" = Table.AddColumn(#"Add Column SORT_YEAR_QUARTER", "SORT_YEAR_QUARTER_MONTH", each [SORT_YEAR_QUARTER] & Text.PadStart(Number.ToText([MONTH]),2,"0")),
#"Add Column SORT_YEAR_QUARTER_MONTH_DAY" = Table.AddColumn(#"Add Column SORT_YEAR_QUARTER_MONTH", "SORT_YEAR_QUARTER_MONTH_DAY", each [SORT_YEAR_QUARTER_MONTH] & Text.PadStart(Number.ToText([DAY]),2,"0")),
#"Changed Type" = Table.TransformColumnTypes(#"Add Column SORT_YEAR_QUARTER_MONTH_DAY",{{"DATE", type date}, {"YEAR", Int64.Type}, {"QUARTER", Int64.Type}, {"MONTH", Int64.Type}, {"DAY", Int64.Type}, {"QUARTER_LABEL", type text}, {"MONTH_LABEL", type text}, {"DAY_LABEL", type text}, {"YEAR_QUARTER_LABEL", type text}, {"YEAR_MONTH_LABEL", type text}, {"SORT_YEAR_QUARTER", Int64.Type}, {"SORT_YEAR_QUARTER_MONTH", Int64.Type}, {"SORT_YEAR_QUARTER_MONTH_DAY", Int64.Type}})
in
#"Changed Type"
- The resulting table should appear as follows with one entry for each day in the specified date range. Adjust or add columns as needed to the table. As an example, a new column may be needed to calculate fiscal quarters that may not align to standard calendar quarters, e.g., fiscal Q1 may be October, November, and December instead of January, February, and March.
- From the
Home
ribbon in the Power Query Editor, clickClose & Apply
to return to Power BI Desktop.
Step 2: Date Table Adjustments
Returning to the Power BI Desktop, the TBL_PQ_DATE_TABLE
is now available in the Data
pane.
If any fields in the TBL_PQ_DATE_TABLE
are unexpectedly aggregated, be sure to set the summarization attribute to Don’t summarize
.
- In the
Data
pane, click any field inTBL_PQ_DATE_TABLE
currently set to summarize. - From the
Column tools
ribbon setSummarization
toDon’t Summarize
. - Repeat until all summarizations are removed.
For each of the text based fields, we need to set the Sort by column
attribute. This informs Power BI how to correctly sort label columns in calendar order instead of alphabetically, e.g., January, February, March, etc.
- Click on each label field and set the
Sort by column
as follows. - Repeat until all label fields are configured.
QUARTER_LABEL
sort by columnQUARTER
MONTH_LABEL
sort by columnMONTH
DAY_LABEL
sort by columnDAY_OF_WEEK
YEAR_QUARTER_LABEL
sort by columnSORT_YEAR_QUARTER
YEAR_MONTH_LABEL
sort by columnSORT_YEAR_QUARTER_MONTH
Next, we’ll create a year / quarter / month hierarchy.
- In the
Data
pane, click theYEAR
field inTBL_PQ_DATE_TABLE
. - Click the ellipsis next to
YEAR
and selectCreate hierarchy
. - Power BI will add a
YEAR Hierarchy
under theTBL_PQ_DATE_TABLE
. - Click the ellipsis next to the
QUARTER_LABEL
field and selectAdd to hierarchy
and thenYEAR Hierarchy
.
Step 3: Mark as Date Table
Now we can inform Power BI to use our custom date table.
- From the
Data
pane, clickTBL_PQ_DATE_TABLE
. - From the
Table tools
ribbon, clickMark as date table
. - The
Mark as a date table
dialog box opens. - Enable
Mark as a date table
. - Verify that the
DATE
field is selected in theChoose a date column
drop-down list. - Click the
Save
button.
Step 4: Set Data Model Relationships
- Switch to the
Model view
. - In this example, I have a simple data table called
DATA
with a date column and a currency amount column. - Create a relationship between the
DATE
columns inTBL_PQ_DATE_TABLE
and theDATA
table.
Once the relationship is established, the data model appears as follows.
Result
- Switch to the
Report view
. - To test the new date hierarchy, create a
Stacked column chart
visualization. - Set the
X-axis
to theYEAR Hierarchy
from the date tableTBL_PQ_DATE_TABLE
. - Set the
Y-axis
toAMOUNT
from theDATA
table.
The visualization is created with the date hierarchy displayed correctly along the axis after expanding down to the lowest level in the hierarchy.
Summary
Creating a custom date table in Power BI gives you full control over your date hierarchy, ensuring accurate and consistent results in visualizations. By following these steps, you can tailor date dimensions to your specific needs, improving the precision and flexibility of your reports.