You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerBI不同列双日期区间下的time字段求和及DAX实现问题

PowerBI DAX 区间日期求和问题

您好,我在PowerBI中遇到了一个无法解决的问题,我对DAX的了解不多。目前我已经有了SQL版本的解决方案,也尝试写了部分DAX代码但无法实现完整需求。

预期结果

我需要对落在两个选定年份区间内的记录的time字段值进行求和。重要规则:如果某行记录的开始日期早于区间起始值、结束日期晚于区间结束值,说明该业务在选定区间内处于激活状态,也需要被纳入计算。

示例图

变量示例:

@sdate = '2020'
@edate = '2021'

可正确运行的SQL逻辑如下:

Select *
From @temp
where (datepart(year,startdate) <= @sdate and datepart(year,enddate) >= @edate)
or (startdate between @sdate and @edate)
or (enddate between @sdate and @edate)

上述SQL在SSMS中运行可以得到正确的结果行。


但在PowerBI中实现时遇到了问题:我需要通过两个筛选器分别选择开始年份和结束年份,目前写的DAX只能筛选出开始年份<=所选起始年且结束年份>=所选结束年的记录(即第3、4行),无法覆盖全部符合条件的记录。


更新:现在这部分逻辑也无法正常运行了
截图1
截图2


我需要纳入所有绿色标记的记录,排除红色标记的记录,目前写的能部分运行的DAX如下:

Antal (under året) =
var SelectedYearStart = CONVERT(SELECTEDVALUE(TEST[startdate].[Year]), INTEGER)
var SelectedYearEnd = CONVERT(SELECTEDVALUE(TEST[enddate].[Year]), INTEGER)
return CALCULATE(SUM(TEST[time]),ALLCROSSFILTERED(TEST),year(TEST[startdate])<=SelectedYearStart , year(TEST[enddate])>=SelectedYearEnd)

我尝试修改为如下逻辑覆盖全部场景,但运行报错:

Antal (under året) =
var SelectedYearStart = CONVERT(SELECTEDVALUE(TEST[startdate].[Year]), INTEGER)
var SelectedYearEnd = CONVERT(SELECTEDVALUE(TEST[enddate].[Year]), INTEGER)
return CALCULATE(SUM(TEST[time]),ALLCROSSFILTERED(TEST),year(TEST[startdate])<=SelectedYearStart , year(TEST[enddate])>=SelectedYearEnd || DATESBETWEEN(TEST[startdate],SelectedYearStart,SelectedYearEnd || DATESBETWEEN(TEST[enddate],SelectedYearStart,SelectedYearEnd)))

报错截图如下:
报错截图

测试数据如下:

declare @sdate nvarchar(4)
declare @edate nvarchar(4)
set @sdate = '2020'
set @edate = '2021'
select @sdate sdate
select @edate edate
DEclare @temp table (time decimal(18,2) , startdate date, enddate date)
INSERT INTO  @temp
SELECT 5.0,'2019-01-01','2020-12-01' union all -- 
SELECT 5.0,'2021-01-01','2022-12-01' union all -- 
select 5.0,'2020-01-01','2021-12-01' union all        
select 5.0,'2019-01-01','2022-12-01' union all --
select 5.0,'2019-01-01','2019-12-01' union all --
select 5.0,'2022-01-01','2022-12-01' union all
select 5.0,'2020-01-01','2020-12-01' union all
select 5.0,'2021-01-01','2021-12-01'
--select 5.0,'2020-01-01','3000-01-01' --EXTRA
SELECT *
into TEST
FROM @temp
--ORDER BY startdate,enddate

修复方案

之前的DAX报错是因为括号位置错误,导致DATESBETWEEN函数入参不符合要求,同时多条件逻辑的写法不符合CALCULATE规则。你可以用日期重叠判断的通用逻辑简化写法,完全等价于你给出的SQL筛选规则,可覆盖所有符合要求的场景:

Antal (under året) =
VAR SelectedYearStart = CONVERT(SELECTEDVALUE(TEST[startdate].[Year]), INTEGER)
VAR SelectedYearEnd = CONVERT(SELECTEDVALUE(TEST[enddate].[Year]), INTEGER)
// 构造选中区间的完整起止日期
VAR IntervalStart = DATE(SelectedYearStart, 1, 1)
VAR IntervalEnd = DATE(SelectedYearEnd, 12, 31)
RETURN
CALCULATE(
    SUM(TEST[time]),
    ALLCROSSFILTERED(TEST),
    // 业务日期和选中区间有重叠即计入
    TEST[startdate] <= IntervalEnd,
    TEST[enddate] >= IntervalStart
)

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:45:04