本篇文章将介绍时间智能函数中的期初至今系列函数,以及由其衍生而来的TOTAL系列函数。
注意,在使用时间智能函数时需要创建日期表,虽然目前的时间智能函数已经优化了很多次,许多限制都已经放开,但创建日期表仍然是一个最佳实践,能够避开许多容易出错的地方。
另外,由于时间智能函数的使用依赖于日期表,而日期表又比较特殊,因此在阅读时间智能函数系列的文章前,最好已经阅读并理解这篇前置文章:32、应用日期表时的注意事项 。
DATESYTD / DATESQTD / DATESMTD 函数
期初至今系列函数可以获取指定日期周期的起始日期至当前日期的日期范围,包含的函数有:DATESYTD、DATESQTD、DATESMTD。
语法:
DATESYTD ( <dates> [,<year_end_date>] )
DATESQTD ( <dates> )
DATESMTD ( <dates> )
作用:在指定的日期字段的当前可见数据中,以最大的日期为基准,返回年初至今/季初至今/月初至今的所有日期。
注意事项:
1、日期参数可以接受三种类型的输入,分别为:对日期列的引用、具有单个日期列的表,以及定义单个日期列表的布尔表达式。
2、日期参数如果是对日期列的引用,那么会触发行上下文转换。
3、返回的日期只包括那些存在于第一参数指定的日期列中的日期。
4、DATESYTD函数的第二参数是用来指定年的结束日期的,默认为"12-31",常用于财年设置,一般省略该参数保持默认即可。
辅助理解的例子:
1、下面是期初至今系列函数的示例表达式与结果,为方便演示特意使用切片器挑选了部分日期来展示,实际使用的日期表是完整且连续的:
需要注意的是,期初至今系列函数返回的都是表,因此在度量值里还需要进行聚合成标量值才行,比如上面就是取首尾两个日期拼接成文本来返回。使用到的度量值表达式具体如下:
DATESYTD =
VAR Period = DATESYTD('日期表'[Date])
RETURN
MINX(Period,'日期表'[Date]) & " - " & MAXX(Period,'日期表'[Date])
DATESQTD =
VAR Period = DATESQTD('日期表'[Date])
RETURN
MINX(Period,'日期表'[Date]) & " - " & MAXX(Period,'日期表'[Date])
DATESMTD =
VAR Period = DATESMTD('日期表'[Date])
RETURN
MINX(Period,'日期表'[Date]) & " - " & MAXX(Period,'日期表'[Date])
2、如果用代码来表示的话,它们的等价写法如下:
- DATESYTD函数的等价写法:
DATESYTD('日期表'[Date])
等价于:
// 等价写法一:
DATESBETWEEN('日期表'[Date],STARTOFYEAR(LASTDATE('日期表'[Date])),LASTDATE('日期表'[Date]))
// 等价写法二:
VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MaxDay = MAXX(tTable,'日期表'[Date])
VAR Result =
FILTER(
ALL('日期表'[Date]),
'日期表'[Date]<=MaxDay&&
YEAR('日期表'[Date])=YEAR(MaxDay)
)
RETURN
Result
- DATESQTD函数的等价写法:
DATESQTD('日期表'[Date])
等价于:
// 等价写法一:
DATESBETWEEN('日期表'[Date],STARTOFQUARTER(LASTDATE('日期表'[Date])),LASTDATE('日期表'[Date]))
// 等价写法二:
VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MaxDay = MAXX(tTable,'日期表'[Date])
VAR Result =
FILTER(
ALL('日期表'[Date]),
'日期表'[Date]<=MaxDay&&
YEAR('日期表'[Date])=YEAR(MaxDay) &&
QUARTER('日期表'[Date])=QUARTER(MaxDay)
)
RETURN
Result
- DATESMTD函数的等价写法:
DATESMTD('日期表'[Date])
等价于:
// 等价写法一:
DATESBETWEEN('日期表'[Date],STARTOFMONTH(LASTDATE('日期表'[Date])),LASTDATE('日期表'[Date]))
// 等价写法二:
VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MaxDay = MAXX(tTable,'日期表'[Date])
VAR Result =
FILTER(
ALL('日期表'[Date]),
'日期表'[Date]<=MaxDay&&
YEAR('日期表'[Date])=YEAR(MaxDay) &&
MONTH('日期表'[Date])=MONTH(MaxDay)
)
RETURN
Result
3、这几个函数的日期参数可以接受三种输入,其中一种就是直接引用日期列,而不需要借助任何表函数,因为它等价于:
CALCULATETABLE ( DISTINCT ( '日期表'[Date] ) )
因此,如果第一参数是直接引用日期列,那么还会触发行上下文转换。
4、除了直接引用日期列,日期参数还可以接受具有单个日期列的表,以及定义单个日期列表的布尔表达式,如下图所示:
使用这两种写法时可能会出现红色波浪线的警告,这可能是智能感知功能出了Bug,语法是没问题的,忽略即可。另外,定义单列表的布尔表达式其实也是一个语法糖,它跟CALCULATE函数的布尔筛选是一样的,完整写法如下:
DATESMTD('日期表'[Date]=dt"2016-3-8")
等价于:
DATESMTD(FILTER(ALL('日期表'[Date]),'日期表'[Date]=dt"2016-3-8"))
需要注意的是,当第一参数不是直接引用日期列时,是不会触发行上下文转换的。
5、期初至今系列函数中没有计算本周至今的函数,因此如果想计算本周至今,那么可以用之前介绍过的DATESINPERIOD函数来计算,如下图所示:
TOTALYTD / TOTALQTD / TOTALMTD 函数
语法:
TOTALYTD ( <expression>, <dates> [,<filter>] [,<year_end_date>] )
TOTALQTD ( <expression>, <dates> [,<filter>] )
TOTALMTD ( <expression>, <dates> [,<filter>] )
作用:在当前计值上下文中,使用年初至今/季初至今/月初至今的日期来计算第一参数的表达式。
该系列的函数是由期初至今系列的函数衍生而来的,是与CALCULATE函数进行封装后的函数,使用频率较低,具体的行为或作用请参考下面的等价写法:
TOTALYTD ( <expression>, <dates> [,<filter>] [,<year_end_date>] )
等价于:
CALCULATE ( <expression>, DATESYTD ( <dates> [,<year_end_date>]) [,<filter>] )
TOTALQTD ( <expression>, <dates> [,<filter>] )
等价于:
CALCULATE ( <expression>, DATESQTD ( <dates> ) [,<filter>] )
TOTALMTD ( <expression>, <dates> [,<filter>] )
等价于:
CALCULATE ( <expression>, DATESMTD ( <dates> ) [,<filter>] )
总结
本篇文章主要介绍了时间智能函数中的期初至今系列的函数,使用频率非常高,建议掌握。