暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在时间智能函数的眼中,1月31日中的"31"不仅仅是一个数字:31,它还是某个月的月底

BISeven 2021-07-24
733

在时间智能函数的眼中,1月31日中的"31"不仅仅是一个数字:31,它还是某个月的月底

SAMEPERIODLASTYEAR/DATEADD 两个函数可以作为计算去年同期的函数。


我们可以通过下面的DAX简单的了解一下这两个函数的用法。


返回2021-1-1的去年同期,可以利用如下代码:

EVALUATE
VAR vDate = FILTER(VALUES('日期表'[日期]), '日期表'[日期]=DATE(2020,1,1))
RETURN
SAMEPERIODLASTYEAR(vDate) // 函数SAMEPERIODLASTYEAR
又或者
EVALUATE
VAR vDate = FILTER(VALUES('日期表'[日期]), '日期表'[日期]=DATE(2020,1,1))
RETURN
DATEADD(vDate, -1, YEAR) // 函数DATEADD

 

这两个函数用起来都比较简单,但是在某种情况下会返回预期之外的结果。

 

假如我们有以下日期表,2020年的一月份有4天,2019年的1月份有5天

 

  • 我们猜一下如下dax的结果应该返回什么?

EVALUATE
VAR vFilter = // 筛选 2020-01-01 到 2020-01-03的日期
FILTER (
'日期表',
'日期表'[日期]
>= DATE ( 2020, 1, 1 )
&& '日期表'[日期]
<= DATE ( 2020, 1, 3 )
)
RETURN
CALCULATETABLE (
SAMEPERIODLASTYEAR(
'日期表'[日期]
),
vFilter
)


这个结果应该不难猜到,返回的是2019/01/01,2019/01/02,2019/01/03:

 

  • 我们修改一下vDate的范围,使其范围变为:2020/01/02-2021/01/03

E

VALUATE
VAR vFilter = // 筛选 2020-01-01 到 2020-01-03的日期
FILTER (
'日期表',
'日期表'[日期]
>= DATE ( 2020, 1, 2 )
&& '日期表'[日期]
<= DATE ( 2020, 1, 3 )
)
RETURN
CALCULATETABLE (
SAMEPERIODLASTYEAR(
'日期表'[日期]
),
vFilter
)


结果应该也不难猜出来,如下:

 

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

 

哦,结果超出了我们的预期,返回的结果中多出了一天:2019/01/05

  • 再修改一下vDate的范围:2021/01/02 - 2021/01/04

EVALUATE
VAR vFilter = // 筛选 2020-01-01 到 2020-01-03的日期
FILTER (
'日期表',
'日期表'[日期]
>= DATE ( 2020, 1, 2 )
&& '日期表'[日期]
<= DATE ( 2020, 1, 4 )
)
RETURN
CALCULATETABLE (
SAMEPERIODLASTYEAR(
'日期表'[日期]
),
vFilter
)

在PowerBI中,日期函数是怎样工作的?

结果还是超出了我们的预期,返回的结果中多出了一天: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函数也会遵循上述的逻辑,你可以试一试,通过这两个简单的函数,我才对时间智能函数中的"智能"有点感觉


关于时间智能函数的"智能"的另一篇文章:


在PowerBI中,日期函数是怎样工作的?


好了,我是BISeven,欢迎交流

文章转载自BISeven,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论