6. DAX 时间函数-- DATE 日期--FIRSTDATE \LASTDATE\DATESMTD\DATESQTD\DATESYTD

发布于:2024-04-22 ⋅ 阅读:(164) ⋅ 点赞:(0)

函数名 目的 语法 返回值
FIRSTDATE  返回指定日期列在当前上下文中的第一个非空日期。 FIRSTDATE ( <日期列> )
表 包含具有日期值的单列和单行的表。
LASTDATE 返回指定日期列在当前上下文中的最后一个非空日期。 LASTDATE ( <日期列> )
表 包含具有日期值的单列和单行的表。
DATESMTD 返回一个表,其中包含当前筛选上下文中该月份至今的所有日期。 DATESMTD ( <日期列> ) 表 包含日期值的单列表
DATESQTD 返回一个表,其中包含当前筛选上下文中该季度至今的所有日期。 DATESQTD ( <日期列> ) 表 包含日期值的单列表
DATESYTD 返回一个表,其中包含当前筛选上下文中该年份至今的所有日期。 DATESYTD ( <日期列> , [年截止日期] ) 表 包含日期值的单列表

一:准备测试数据

我喜欢用数据说话,还是使用之前的测试数据,这套数据横跨 4 年,从 2024 年到 2026 年,每天都不停歇,最早日期是 2024-02-01,最晚日期是 2026-07-11,销售额第一天是 1,第二天是 2,依次到2026-07-11 是 892。

二: 实践出真知

 建议先看看前面几篇文章

3. DAX 时间函数-- DATE 日期--一生二,二生三,三生万物_dax date函数-CSDN博客

4. DAX 时间函数-- DATE 日期--START/END OF MONTH/QUARTER/YEAR-CSDN博客

5. DAX 时间函数-- DATE 日期--PREVIOUS/NEXT DAY/MONTH/QUARTER/YEAR-CSDN博客

1) FIRSTDATE 和 LASTDATE 函数
FIRSTDATE  返回指定日期列在当前上下文中的第一个非空日期。 FIRSTDATE ( <日期列> )
表 包含具有日期值的单列和单行的表。
LASTDATE 返回指定日期列在当前上下文中的最后一个非空日期。 LASTDATE ( <日期列> )
表 包含具有日期值的单列和单行的表。

这两个函数很明显,一看就是配套使用。从微软的官方解释来看,也非常简单,我们试试到底是不是这样。

我们准备一下:

FIRSTDATE = FIRSTDATE('日期表'[Date])
LASTDATE = LASTDATE('日期表'[Date])
FIRSTDATE CAL = CALCULATE(SUM('测试数据'[销售额]),FIRSTDATE('日期表'[Date]))
LASTDATE CAL = CALCULATE(SUM('测试数据'[销售额]),LASTDATE('日期表'[Date]))

从上图可以看出,FIRSTDATE 、LASTDATE适用于单独找出上下文的日期值,如果和 CALCULATE 系列函数使用,那么它返回的其实是上下文中的所有非空值,而不是字面意思上的第一个、最后一个!

为了验证这一观念,我新写了一个度量指标,然后在过滤器上移动数值范围,可以验证我的观点。

SUM 销售额 = SUM('测试数据'[销售额]) 

2)DATESMTD、DATESQTD、DATESYTD
DATESMTD 返回一个表,其中包含当前筛选上下文中该月份至今的所有日期。 DATESMTD ( <日期列> ) 表 包含日期值的单列表
DATESQTD 返回一个表,其中包含当前筛选上下文中该季度至今的所有日期。 DATESQTD ( <日期列> ) 表 包含日期值的单列表
DATESYTD 返回一个表,其中包含当前筛选上下文中该年份至今的所有日期。 DATESYTD ( <日期列> , [年截止日期] ) 表 包含日期值的单列表

这三个函数说得很清楚,直接就是返回“表 包含日期值的单列表”。 

 我先试试创建新表,此刻是 2024-04-18,让我们看看结果。

DATESMTD 表 = DATESMTD('测试数据'[Date]) 
DATESQTD 表 = DATESQTD('测试数据'[Date]) 
DATESYTD 表 = DATESYTD('测试数据'[Date]) 

根据上面三个图,可以看出使用 DATESMTD、DATESQTD、DATESYTD 三个函数创建新表时候,是依次创建出该月份至今该季度至今该年至今的日期列表。但是请注意,所谓的该月份,是上下文数据中最靠后的数据,而不是当前数据!正确!

然后我们还可以配套 CALCULATE 使用:

DATESMTD = CALCULATE(SUM('测试数据'[销售额]),DATESMTD('测试数据'[Date]))
DATESQTD = CALCULATE(SUM('测试数据'[销售额]),DATESQTD('测试数据'[Date]))
DATESYTD = CALCULATE(SUM('测试数据'[销售额]),DATESYTD('测试数据'[Date]))

在移动过滤器时候,就会发现移动左值对结果是没有影响的,只有移动右值才有影响。这也进一步证明了前面的结论“使用 DATESMTD、DATESQTD、DATESYTD 三个函数创建新表时候,是依次创建出该月份至今该季度至今该年至今的日期列表。但是请注意,所谓的该月份,是上下文数据中最靠后的数据,而不是当前数据!

~~~~~~~~~~~~博客写得好累,为了攒分,请给个点评,哪怕一个赞字,谢谢同学!~~~~~~~~~