2.1.4 创建Date表
DAX时间智能函数可在任何标准公历日历表上使用。如果你已经有一个Date表,则可以将其导入并使用,而不会出现任何问题。如果没有Date表,则可以使用DAX计算表来创建。例如,以下DAX表达式定义了本章中使用的简单Date表。
计算表
Date =
VAR FirstFiscalMonth = 7 -- 会计年度的第一个月
VAR FirstDayOfWeek = 0 -- 0 = 周日, 1 = 周一, ...
VAR FirstYear = -- 自定义使用的第一个年份
YEAR ( MIN ( Sales[Order Date] ))
RETURN
GENERATE (
FILTER (
CALENDARAUTO (),
YEAR ( [Date] ) >= FirstYear
),
VAR Yr = YEAR ( [Date] ) -- 年份编号
VAR Mn = MONTH ( [Date] ) -- 月份编号(1-12)
VAR Qr = QUARTER ( [Date] ) -- 季度编号(1-4)
VAR MnQ = Mn - 3 * (Qr - 1) -- 季度中的月份编号(1-3)
VAR Wd = WEEKDAY ( [Date], 1 ) –1 -- 星期几(0 = 周日,1 = 周一,...)
VAR Fyr = -- 会计年度编号
Yr + 1 * ( FirstFiscalMonth > 1 && Mn >= FirstFiscalMonth )
VAR Fqr = -- 会计季度(字符串)
FORMAT ( EOMONTH ( [Date], 1 - FirstFiscalMonth ), "\QQ" )
RETURN ROW (
"Year", DATE ( Yr, 12, 31 ),
"Year Quarter", FORMAT ( [Date], "\QQ-YYYY" ),
"Year Quarter Date", EOMONTH ( [Date], 3 - MnQ ),
"Quarter", FORMAT ( [Date], "\QQ" ),
"Year Month", EOMONTH ( [Date], 0 ),
"Month", DATE ( 1900, MONTH ( [Date] ), 1 ),
"Day of Week", DATE ( 1900, 1, 7 + Wd + (7 * (Wd < FirstDayOfWeek)) ),
"Fiscal Year", DATE ( Fyr + (FirstFiscalMonth = 1), FirstFiscalMonth, 1 ) - 1,
"Fiscal Year Quarter", "F" & Fqr & "-" & Fyr,
"Fiscal Year Quarter Date", EOMONTH ( [Date], 3 - MnQ ),
"Fiscal Quarter", "F" & Fqr
)
)
你可以自定义前3个变量以创建满足特定业务需求的Date表。为了获得正确的结果,当列不是文本格式,而是具有标准或自定义格式的“日期”数据类型时,必须按以下方式在数据模型中对列进行设置。
● Date:m/dd/yyyy(8/14/2007),用作标记为日期表的列。
● Year:yyyy(2007)。
● Year Quarter:文本(Q3-2008)。
● Year Quarter Date:隐藏(9/30/2008)。
● Quarter:文本(Q1)。
● Year Month:mmm yyyy(Aug 2007)。
● Month:mmm(Aug)。
● Day of Week:ddd(Tue)。
● Fiscal Year:\F\Y yyyy(FY 2008)。
● Fiscal Year Quarter:文本(FQ1-2008)。
● Fiscal Year Quarter Date:隐藏(9/30/2008)。
● Fiscal Quarter:文本(FQ1)。
此模式中的Date表具有两个层次结构。
● 日历:年(Year)、季度(Year Quarter)和月(Year Month)。
● 会计:年(Fiscal Year)、季度(Fiscal Year Quarter)和月(Year Month)。
不管来源如何,若要使用此模式的公式,Date表必须包括一个隐藏的DateWithSales计算列。
Date表中的计算列
DateWithSales =
'Date'[Date] <= MAX ( Sales[Order Date] )
如果日期早于或等于Sales表中的最后交易日期,则Date[DateWithSales]列是TRUE,否则为FALSE。换句话说,“过去”日期的DateWithSales为TRUE,“未来”日期的DateWithSales为FALSE,这里的“过去”和“未来”均是相对于Sales中的最后交易日期来定义的。