DAX中STARTOFYEAR获取当年、财年首日结果异常求助
DAX年初/财年初度量值返回错误的解决方案
错误原因
直接将完整的'Calendar'[Date]列作为参数传入STARTOFYEAR时,函数会扫描日历表的全量日期范围,不受当前日期上下文(当前系统时间、报表切片器选中时间)约束,最终只会返回日历表中最早年份的首日,也就是你看到的2019/1/1。
另外财年计算不需要嵌套DATEADD函数,STARTOFYEAR原生支持自定义财年结束日期参数,嵌套日期偏移反而会打乱上下文计算逻辑。
正确度量值写法
1. 自然年首日(当前时间/筛选上下文对应年份的1月1日)
以下写法会自动锚定当前上下文的有效日期,2022年6月场景下会正确返回2022/1/1,有切片器筛选时会自动跟随筛选结果返回对应年份首日:
First Day of Year = STARTOFYEAR(DATESYTD('Calendar'[Date]))
如果需要更明确锚定当前最新日期避免筛选异常,可以用变量固定基准日期:
First Day of Year = VAR BaseDate = MAX('Calendar'[Date]) RETURN DATE(YEAR(BaseDate), 1, 1)
2. 财年首日(上一年度10月1日,即财年从10月1日开始、次年9月30日结束)
直接利用STARTOFYEAR的第二参数指定财年结束日期即可,不需要嵌套日期偏移函数,2022年6月场景下会正确返回2021/10/1:
First Day of Fiscal Year = STARTOFYEAR('Calendar'[Date], "9-30")
同样可以用变量写法提升兼容性,避免日期表不连续导致的计算错误:
First Day of Fiscal Year = VAR BaseDate = MAX('Calendar'[Date]) VAR FiscalYearStartMonth = 10 RETURN IF( MONTH(BaseDate) >= FiscalYearStartMonth, DATE(YEAR(BaseDate), FiscalYearStartMonth, 1), DATE(YEAR(BaseDate) - 1, FiscalYearStartMonth, 1) )
注意事项
- 使用DAX时间智能函数前,必须确保日历表是连续无断层的标准日期表,且已在数据模型中标记为日期表
- 上述写法会自动适配报表切片器、页面筛选器的时间筛选条件,不需要额外做上下文调整
内容的提问来源于stack exchange,提问作者Robert Kendall
相关产品推荐
相关产品推荐

