时间智能函数(DAX)
DAX包括时间智能函数,这些时间智能函数通过使用时间段(包括日、月、季度和年)对数据进行操作,然后生成和比较针对这些时段的计算,支持商业智能分析的需要。要想时间智能函数使用更加灵活,主要需要解决下列三个问题:
- 参照依据(参考的是时间点还是时间段)
- 位移量(从参考的时间点/段往前/后移动多长的时间)
- 返回区间
涉及到时间智能函数的细节时,在使用之前需要对函数进行详细的测试,这样才能了解它的使用逻辑。
使用的测试数据如下表(测试表,2019年1月1日到2019年6月29日一共180天)
日期 金额
2019年1月1日 10
2019年1月2日 10
2019年1月3日 10
2019年1月4日 10
2019年1月5日 10
... ...
2019年6月28日 10
2019年6月29日 10
TOTALMTD 函数
计算当前上下文中当月至今的 expression 的值。
TOTALMTD(<expression>,<dates>[,<filter>])
参数:
- expression
一个返回标量值的表达式。 - dates
包含日期的列。 - filter
(可选)指定要应用到当前上下文的筛选器的表达式。
测试
在Power BI数据视图下创建新度量MtD,如下:
MtD = totalmtd(sum('测试表'[金额]),'测试表'[日期])
时间点测试:
时间段测试:


总结:
参照时间点,位移到所选时间点所在月份的第一天,从月初到指定时间点下的汇总值,如:
2.5: 2.1 - 2.5 合计金额50
3.20:3.1 - 3.20 合计金额200不能参照时间段,介于模式下,受后点影响不受前点影响
PREVIOUSMONTH 函数
返回一个表,该表包含的一列具有当前上下文中基于 dates 列中第一个日期的上个月中的所有日期。
PREVIOUSMONTH(<dates>)
参数:
- Dates
包含日期的列。
测试
在Power BI数据视图下创建新度量mPreviousMonth,如下:
mPreviousMonth = calculate([金额合计],PREVIOUSMONTH('测试表'[日期]))
时间点测试:
时间段测试:


总结:
参照时间点,位移到所选时间点所在月份的上一个月,返回上个月的汇总值,如:
1.6: 合计金额0
2.17:1.1 - 1.31 合计金额310不能参照时间段,介于模式下,受前点影响不受后点影响
DATEADD 函数
返回一个表,该表包含由日期构成的一列,这些日期是在时间上从当前上下文中的日期前移或后移指定间隔数目的日期。
DATEADD(<dates>,<number_of_intervals>,<interval>)
参数:
- dates
包含日期的列。 - number_of_intervals
一个整数,指定要从日期中加上或减去的间隔数。 - interval
日期按其轮换的间隔。 间隔值可以是以下值之一:year、quarter、month、day
测试
在Power BI数据视图下创建新度量mmDateAdd,如下:
mmDateAdd = calculate(sum('测试表'[金额]),dateadd('测试表'[日期],-1,MONTH))
时间点测试:
时间段测试:


总结:
- 参照点:往前移一个月,返回上个月对应日期下的值
- 时间段:前后点各往前移一个月,新的位置下,前后点构成时间段的汇总值(2.1-2.22 —> 1.1-1.22)
如果选某月最后一天,位移到上月最后一天(2.1-2.28 —> 1.1-1.31)
如果选日期>上月最后一天,返回上月最后一天(3.1-3.29 —> 2.1-2.28)
时间智能类函数Bug的解决方案
Bug: 当月的金额折线和上个月的金额(用DateAdd函数计算出的值)折线重合,并没有出现错位的情形。
解决方案(以Power BI为例):
创建日期辅助列表
点击主页—>转换数据—>新建源—>空查询,输入框输入= List.Dates,然后回车,出现下面的界面
将日期辅助列表转换为日期辅助表

可以修改字段及表名

修改日期辅助表中日期字段的数据类型为日期型

连接日期辅助表与原始数据中的日期字段

所有度量值计算公式中使用的日期参数都要用日期辅助表里的日期、 所有展示界面中关于日期的设置内容都要用日期辅助表里的日期字段

注: 由于时间智能函数的这个bug,所以我们在计算同比、环比的时候,都需要创建日期辅助表。