2.1.1 什么是标准DAX时间智能函数
标准时间智能函数是表函数,该函数返回在CALCULATE中用作筛选器的日期列表。通过编写更复杂的筛选器表达式可以获得时间智能函数的结果。例如,DATESYTD函数可以返回筛选上下文中从显示的日期所在年份的第一天到显示的最后一天之间的所有日期。下方的表达式:
DATESYTD ( 'Date'[Date] )
对应下方的FILTER表达式:
VAR LastDateAvailable = MAX ( 'Date'[Date] )
VAR FirstJanuaryOfLastDate = DATE ( YEAR ( LastDateAvailable ), 1, 1 )
RETURN
FILTER (
ALL ( 'Date'[Date] ),
AND (
'Date'[Date] >= FirstJanuaryOfLastDate,
'Date'[Date] <= LastDateAvailable
)
)
时间智能函数有很多,大多数时间智能函数是以这种方式呈现的。请注意:时间智能函数应用作CALCULATE的筛选器参数,有时你会通过使用变量来实现这一点。在迭代器中使用时间智能函数是很危险的,因为会触发隐式上下文转换,从而导致从筛选上下文中检索有效日期。DAX指南文档中提供了更多详细信息。
以下是使用时间智能函数时最佳做法的快速指南。
● 仅在CALCULATE / CALCULATETABLE的筛选器参数中使用诸如DATESYTD之类的时间智能函数,或给变量分配筛选器。
● 在返回值的DAX公式中使用EDATE和EOMONTH之类的标量函数(也称为标量表达式)。这些函数不是时间智能函数,可以用于以行上下文执行的表达式中。
● 使用CONVERT将日期转换为数字,反之亦然。
● 有关时间智能函数的完整最新列表,请访问DAX GUIDE网站。
DAX初学者经常将时间智能函数与常规(标量)时间函数混淆。这种混淆导致出现常见错误,可以通过遵循以下建议来避免。
● 不要使用DATEADD来返回前一天或后一天。可以使用简单的数学运算符来做到这一点。
● 不要使用PREVIOUSDAY来计算标量表达式中的前一天。从日期中减1,即可获得标量表达式中的前一天。
● 不要将EOMONTH用作筛选器,而应使用ENDOFMONTH。EOMONTH是标量表达式。ENDOFMONTH是时间智能函数。请始终注意函数的返回类型:只有表函数是时间智能函数,因此不应当用于标量表达式中。