在实际代码过程中,总会遇到各种需求,往往需要一个或者多个函数一起实现目的。在下面的过程中,我尽量使用简洁而优美的代码,来实现各个目的。
首先准备数据,使用 1. DAX 时间函数--生成日期表 中的 GENERATE CALENDAR 生成一个日期表,从 2017 年 1 月 1 日到 2025 年 12 月 31 日,如下图
再创建一个表“测试数据”,其中有Date域,为日期格式。
1. 取一段时间中的最早、最晚日期
关于取最早时间,此处给三种写法,大家可以看看有什么不一样
最早日期-MIN = MIN('测试数据'[Date])
最早日期-FIRSTDATE1 = FIRSTDATE('测试数据'[Date])
最早日期-FIRSTDATE2 = FIRSTDATE('测试数据'[Date].[Date])
大家可以注意到,第一、二种写法可以随着切片器的变化而变化,但是第三种写法则是固定的结果,这是因为取'测试数据'[Date].[Date]时候,已经是提前将数据取出来了,不受切片器的变化而变化了,所以请大家注意。
打算如果是在此处看到 MIN 和 FIRSTDATE 可以达到一样的效果,但是在 CALCULATE 语句中FIRSTDATE 会发生变化,详情请看 6. DAX 时间函数-- DATE 日期--FIRSTDATE \LASTDATE\DATESMTD\DATESQTD\DATESYTD_dax 计算上月月份天
取最晚时间,可用代码
最早日期-MAX= MAX('测试数据'[Date])
最早日期-LASTDATE = LASTDATE('测试数据'[Date])
2.两个日期中的自然日计数
如果想实现两个日期中的自然日计数,可以使用以下代码,两种方式效果相同
自然日数量 = COUNTROWS(FILTER('日期表',AND('日期表'[Date]>=[最早日期],'日期表'[Date]<=[最晚日期])) )
自然日数量 =COUNTROWS(FILTER(CALENDAR([最早日期], [最晚日期]))
3.两个日期中的工作日计数
如果想实现两个日期中的工作日计数,可以使用以下代码,两种方式效果相同
工作日数量 = COUNTROWS(FILTER('日期表',AND(AND('日期表'[Date].[Date]>=[最早日期],'日期表'[Date].[Date]<=[最晚日期]),'日期表'[星期编号]<6)))
工作日数量 =
COUNTROWS(
FILTER(
CALENDAR([最早日期], [最晚日期]),
WEEKDAY([Date], 2) < 6 的值
)
)
-- 这里使用WEEKDAY函数,2表示周一是工作周的第一天,返回1到5
4.两个日期中的周一的计数
星期一数量 = COUNTROWS(FILTER('日期表',WEEKDAY('日期表'[Date])=1))