使用DATEADD函数获取上月数据的DAX度量跨年时失效
问题分析与修改方案
原代码的核心问题是手动拆分月份和年份进行判断,当处理12月的Data Deployment Date时,MONTH(Table[Data Deployment Date]) -1得到11,但结合DATEADD(Calendar[Deployment Date],1,MONTH)的筛选逻辑,此时日历表日期已跳转至下一年1月,导致年份判断条件会错误匹配下一年的11月数据,从而引发异常。
改用EOMONTH函数可以自动处理跨年份的月份计算,无需手动判断年份和月份,以下是修改后的代码:
Completed Days on Site DOS = CALCULATE( SUM(Table[# Actual DOS]), DATEADD(Calendar[Deployment Date],1,MONTH), // 取提前一个月的报告数据 // 判断Visit Date是否为Data Deployment Date的前一个月 EOMONTH(Table[Visit Date], 0) = EOMONTH(Table[Data Deployment Date], -1) )
代码说明
EOMONTH(Table[Visit Date], 0):返回Visit Date所在月份的最后一天EOMONTH(Table[Data Deployment Date], -1):返回Data Deployment Date前一个月的最后一天- 通过对比两个日期的月末值,即可精准匹配
Visit Date属于Data Deployment Date前一个月的所有记录,自动处理1月(匹配上一年12月)和12月(匹配同年11月)的跨年份场景。
若需要更直观的年份+月份匹配写法,也可以使用以下代码:
Completed Days on Site DOS = CALCULATE( SUM(Table[# Actual DOS]), DATEADD(Calendar[Deployment Date],1,MONTH), // 组合年份和月份,判断是否为前一个月 DATE(YEAR(Table[Data Deployment Date]), MONTH(Table[Data Deployment Date]), 1) = DATEADD(Table[Visit Date], 1, MONTH) )
内容的提问来源于stack exchange,提问作者Pawel Osipowski
相关产品推荐
相关产品推荐

