在时间智能函数的眼中,1月31日中的"31"不仅仅是一个数字:31,它还是某个月的月底
SAMEPERIODLASTYEAR/DATEADD 两个函数可以作为计算去年同期的函数。
我们可以通过下面的DAX简单的了解一下这两个函数的用法。
返回2021-1-1的去年同期,可以利用如下代码:
EVALUATEVAR vDate = FILTER(VALUES('日期表'[日期]), '日期表'[日期]=DATE(2020,1,1))RETURNSAMEPERIODLASTYEAR(vDate) // 函数SAMEPERIODLASTYEAR又或者EVALUATEVAR vDate = FILTER(VALUES('日期表'[日期]), '日期表'[日期]=DATE(2020,1,1))RETURNDATEADD(vDate, -1, YEAR) // 函数DATEADD
这两个函数用起来都比较简单,但是在某种情况下会返回预期之外的结果。
假如我们有以下日期表,2020年的一月份有4天,2019年的1月份有5天

我们猜一下如下dax的结果应该返回什么?
EVALUATEVAR vFilter = // 筛选 2020-01-01 到 2020-01-03的日期FILTER ('日期表','日期表'[日期]>= DATE ( 2020, 1, 1 )&& '日期表'[日期]<= DATE ( 2020, 1, 3 ))RETURNCALCULATETABLE (SAMEPERIODLASTYEAR('日期表'[日期]),vFilter)
这个结果应该不难猜到,返回的是2019/01/01,2019/01/02,2019/01/03:

我们修改一下vDate的范围,使其范围变为:2020/01/02-2021/01/03
E
VALUATEVAR vFilter = // 筛选 2020-01-01 到 2020-01-03的日期FILTER ('日期表','日期表'[日期]>= DATE ( 2020, 1, 2 )&& '日期表'[日期]<= DATE ( 2020, 1, 3 ))RETURNCALCULATETABLE (SAMEPERIODLASTYEAR('日期表'[日期]),vFilter)
结果应该也不难猜出来,如下:

但是,如果我们将vDate修改为2021/01/01 - 2021/01/04,那结果还是不是如我们猜想的呢?

哦,结果超出了我们的预期,返回的结果中多出了一天:2019/01/05
再修改一下vDate的范围:2021/01/02 - 2021/01/04
EVALUATEVAR vFilter = // 筛选 2020-01-01 到 2020-01-03的日期FILTER ('日期表','日期表'[日期]>= DATE ( 2020, 1, 2 )&& '日期表'[日期]<= DATE ( 2020, 1, 4 ))RETURNCALCULATETABLE (SAMEPERIODLASTYEAR('日期表'[日期]),vFilter)

结果还是超出了我们的预期,返回的结果中多出了一天:2019/01/05
这是什么原因呢?
在这里大胆的猜测一下,因为在日期表中2021-01-04是该月份的最后一天,即意味着月底,2021/01/01~2021/01/4意味着:2021/01/01~月底,所以对应的去年同期:2019/01/01~月底,所以(2021/01/01 or 2021/01/02)~2021/01/04返回的去年同期都比我们预期的结果多出1天。
同理,DATEADD函数也会遵循上述的逻辑,你可以试一试,通过这两个简单的函数,我才对时间智能函数中的"智能"有点感觉
关于时间智能函数的"智能"的另一篇文章:
好了,我是BISeven,欢迎交流




