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

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_DATETIMEEND_DATETIMEWorkflowsworkflow
1/1/2024 9:45:09 PM1/1/2024 11:26:00 PMworkflowNO
1/1/2024 9:46:34 PM1/1/2024 11:40:23 PMworkflow2NO

现有解决方案代码

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_DATETIMEEND_DATETIMEWorkflowsWorkflow
1/1/2024 1:00:09 PM1/1/2024 2:08:55 PMworkflowYES
1/1/2024 1:03:09 PM1/1/2024 3:40:04 PMworkflowYES

问题分析

现有代码的核心错误在于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

修正说明

  1. 统一工作流名称变量,避免硬编码错误
  2. 简化有效时间窗口的判断逻辑,直接通过TIMEVALUE对比时间区间
  3. 明确计算允许的截止时间为START日期的15:00,确保当天超时(如15:40)或跨天的END_DATETIME会被正确判定为超时
  4. 优化条件判断的可读性,减少冗余逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:35:57