I was working on a SSAS Tabular 2016 solution for a project for which I had no data (an empty data model, but no data). I was not in control of the source data warehouse, so I couldn’t change what I had, but I needed to get started. So I went about creating a date dimension with a fiscal calendar entirely in DAX. There are several scripts out there to create a date dimension. Although there are many nice alternatives for Power BI that are built in M or a combination of M and DAX, I haven’t seen many full date dimensions with a fiscal calendar just using DAX.
I’ll explain some of the DAX calculations below, but I put the TMSL/JSON in Gist so you can easily paste into a SSAS 2016 Tabular project. The JSON has the added benefit of retaining data types, formatting, hidden, and sort by properties.
The fiscal calendar assumes calendar months with the fiscal calendar shifted by some number of months. It also assumes that the fiscal year is ahead of the calendar year. That is, fiscal year 2017 starts in the first day of some month in 2016. In my example script, the fiscal year starts in October. If you have some 4-4-5, 4-5-4, or other calendar, the fiscal calendar calculations in this script won’t help you.
To add this date dimension to your SSAS Tabular project:
- Right click on the Model.bim file in the Solution Explorer and choose View Code.
- If you have at least one table in the model already, locate the end of the definition of the previous table, inside the table array. Add a comma after the end curly brace for the previous table.
- Paste the JSON/TMSL from my Gist.
- Save and close the file.
- Right click on Model.Bim and choose View Designer.
To adjust the date range included in the Date table, locate the [Date] field. The current calculation is:
The current date range goes from 1 Jan 2010 through 31 Dec 2025.
To adjust the start of the fiscal year, change the expression in the [Fiscal Year Month Begin] field. The current calculation is
This field represents the calendar month number in which the fiscal year begins. If your fiscal calendar begins in July, you’ll want to change the 10 to 7.
You shouldn’t have to adjust anything else in the date dimension to get correct values.
I used the FORMAT() function to get a lot of the calendar fields as well as the [DateKey] field.
DateKey = VALUE(FORMAT([Date],"YYYYMMDD")) Month Year Abbrev = FORMAT([Date],"mmm YYYY") Month Name = FORMAT([Date],"mmmm") Day of Week = FORMAT([Date],"dddd") Qtr Nbr = VALUE(FORMAT([Date],"Q"))
Many of the fiscal calendar fields use the EDATE() to shift date calculations to the correct month. The [Fiscal Year Nbr] field uses the [Fiscal Year Month Begin] field to ensure the correct year is shown.
Month Shift = 13 - [Fiscal Year Month Begin] Fiscal Month Nbr = MONTH(EDATE([Date],[Month Shift])) Fiscal Quarter Nbr = ROUNDUP(MONTH(EDATE([Date],[Month Shift]))/3,0) Fiscal Year Nbr = IF([Month Nbr] >= VALUE(FORMAT(Date([Year], [Fiscal Year Month Begin],1),"M")), [Year]+1, [Year])
I also like to include the beginning and end dates for month, quarter, and year.
Begin of Month = DATE([Year],[Month Nbr],1) End of Month = EOMONTH([Date],0) Begin of Quarter = IF([Month Nbr]<4,DATE([Year],1,1), IF([Month Nbr]<7,DATE([Year],4,1), IF([Month Nbr]<10,DATE([Year],7,1), DATE([Year],10,1)))) End of Quarter = IF([Month Nbr]<4,DATE([Year],3,31), IF([Month Nbr]<7,DATE([Year],6,30), IF([Month Nbr]<10,DATE([Year],9,30), DATE([Year],12,31)))) Begin of Year = DATE([Year],1,1) End of Year = DATE([Year],12,31)
DAX has a nice EOMONTH() function to get the end of the month now. There are multiple ways to get end of quarter. I used an if statement. You could also use SWITCH(). I also included begin and end dates for the fiscal quarter and year (end of month is the same since my calendar assumes fiscal months are calendar months).
Begin of Fiscal Year = DATE([Fiscal Year Nbr]-1,[Fiscal Year Month Begin],1) End of Fiscal Year = EOMONTH( Date([Fiscal Year Nbr],[Fiscal Year Month Begin],1),-1) Begin of Fiscal Quarter = IF([Fiscal Quarter Nbr]=1,[Begin of Fiscal Year], IF([Fiscal Quarter Nbr] = 2, EDATE([Begin of Fiscal Year],3), IF([Fiscal Quarter Nbr] = 3, EDATE([Begin of Fiscal Year],6), EDATE([Begin of Fiscal Year],9)))) End of Fiscal Quarter = IF([Fiscal Quarter Nbr]=1, EDATE([Begin of Fiscal Year],3)-1, IF([Fiscal Quarter Nbr] = 2, EDATE([Begin of Fiscal Year],6)-1, IF([Fiscal Quarter Nbr] = 3, EDATE([Begin of Fiscal Year],9)-1, EDATE([Begin of Fiscal Year],12)-1)))
The EOMONTH() function allows you to shift forward or backward from the current selected month. For the end of the fiscal year, I went to the beginning of the next fiscal year, subtracted a month, and then found the end of that month. The end of fiscal quarter calculation follows similar logic get the month that begins the next quarter and subtract one day.