PowerBI中END_DATETIME跨午夜计算异常问题求助
PowerBI DAX修正:END_DATETIME超时判断异常问题
当END_DATETIME处于午夜之后时,原DAX计算逻辑出现异常;现有解决方案中,当截止时间设置为15:00时,END_DATETIME为1/1/2024 3:40:04 PM的记录应返回"NO",但当前错误显示为"YES",需修正逻辑。
原DAX代码
COLUMN = VAR CheckWorkflow = IF(NOT(Table[Workflows] = "workflow"),TRUE(),FALSE()) VAR CheckBlankStartEnd = OR(ISBLANK(Table[START_DATETIME]),ISBLANK(Table[END_DATETIME])) VAR StartTimeSeconds = HOUR(Table[START_DATETIME])*3600 + MINUTE(Table[START_DATETIME])*60 + SECOND(Table[START_DATETIME]) VAR StartTime = (22*3600 + 30*60) VAR StartTimeEnd = (23*3600 + 30*60) VAR EndTimeSeconds = HOUR(Table[END_DATETIME])*3600 + MINUTE(Table[END_DATETIME])*60 + SECOND(Table[END_DATETIME]) VAR EndTime = (30*60) VAR CheckStartEndTime = AND( AND(StartTimeSeconds >= StartTime,StartTimeSeconds <= StartTimeEnd), EndTimeSeconds <= EndTime) VAR CheckStartTime = AND(StartTimeSeconds >= StartTime,StartTimeSeconds <= StartTimeEnd) VAR Result = SWITCH( TRUE(), CheckWorkflow,BLANK(), CheckBlankStartEnd,BLANK(), CheckStartEndTime,"YES", CheckStartTime,"NO", BLANK() ) RETURN Result
原示例数据表
| START_DATETIME | END_DATETIME | Workflows | workflow |
|---|---|---|---|
| 1/1/2024 9:45:09 PM | 1/1/2024 11:26:00 PM | workflow | NO |
| 1/1/2024 9:46:34 PM | 1/1/2024 11:40:23 PM | workflow2 | NO |
现有解决方案代码
COLUMN = VAR CheckWorkflow = IF(NOT(TABLE[WORKFLOW_NAME] = "WORKFLOW1"), TRUE(), FALSE()) VAR checkBlankStartEnd = ISBLANK(TABLE[START_DATETIME]) || ISBLANK(TABLE[END_DATETIME]) VAR startTime = TIME(12, 30, 0) VAR startTimeEnd = TIME(13, 30, 0) VAR jobStartTime = TIMEVALUE(TABLE[START_DATETIME]) VAR jobEndBy = DATEVALUE(TABLE[START_DATETIME]) + TIME(0, 0, 0) VAR endTime = IF(jobEndBy <= jobStartTime, 1, 0) + TIME(15, 0, 0) VAR checkStartTime = startTime <= jobStartTime && jobStartTime <= startTimeEnd VAR checkEndTime = TABLE[END_DATETIME] <= DATEVALUE(TABLE[START_DATETIME]) + endTime VAR result = SWITCH( TRUE(), checkWorkflow, BLANK(), checkBlankStartEnd, BLANK(), checkStartTime && checkEndTime, "YES", checkStartTime, "NO", BLANK() ) RETURN result
更新后的数据表(存在异常)
| START_DATETIME | END_DATETIME | Workflows | Workflow |
|---|---|---|---|
| 1/1/2024 1:00:09 PM | 1/1/2024 2:08:55 PM | workflow | YES |
| 1/1/2024 1:03:09 PM | 1/1/2024 3:40:04 PM | workflow | YES |
问题分析
现有代码的核心错误在于endTime的计算逻辑:
jobEndBy <= jobStartTime的判断完全不成立(日期序列号整数永远大于时间部分的小数),导致endTime始终为TIME(15,0,0)- 判断截止时间时未正确识别当天超时的记录,逻辑漏洞导致超时数据被误判为符合条件。
修正后的DAX代码
COLUMN = VAR TargetWorkflow = "workflow" -- 统一目标工作流名称 VAR CheckWorkflow = NOT(Table[Workflows] = TargetWorkflow) VAR CheckBlankStartEnd = OR(ISBLANK(Table[START_DATETIME]), ISBLANK(Table[END_DATETIME])) -- 定义START的有效时间窗口:12:30-13:30 VAR StartWindowStart = TIME(12, 30, 0) VAR StartWindowEnd = TIME(13, 30, 0) VAR IsInStartWindow = AND( TIMEVALUE(Table[START_DATETIME]) >= StartWindowStart, TIMEVALUE(Table[START_DATETIME]) <= StartWindowEnd ) -- 计算允许的截止时间:START日期的15:00 VAR AllowableEndTime = DATEVALUE(Table[START_DATETIME]) + TIME(15, 0, 0) -- 判断END是否在允许的截止时间内(跨天或当天超时均判定为不符合) VAR IsEndInTime = Table[END_DATETIME] <= AllowableEndTime VAR Result = SWITCH( TRUE(), CheckWorkflow, BLANK(), CheckBlankStartEnd, BLANK(), AND(IsInStartWindow, IsEndInTime), "YES", IsInStartWindow, "NO", BLANK() ) RETURN Result
修正说明
- 统一工作流名称变量,避免硬编码错误
- 简化有效时间窗口的判断逻辑,直接通过
TIMEVALUE对比时间区间 - 明确计算允许的截止时间为START日期的15:00,确保当天超时(如15:40)或跨天的END_DATETIME会被正确判定为超时
- 优化条件判断的可读性,减少冗余逻辑
内容的提问来源于stack exchange,提问作者BoboMobo
相关产品推荐
相关产品推荐

