将小时数转换为持续时间 (HH:mm:ss) 格式 DAX

Converting Hour Numbers to Duration (HH:mm:ss) format DAX

提问人:Gian Carlo 提问时间:11/14/2023 更新时间:11/17/2023 访问量:50

问:

因此,我通过 PowerQuery 导入了这组数据,并将其加载到 Excel 工作簿的数据模型中。为了减少查询加载时间,我决定将大部分转换转移到数据模型而不是查询编辑器。现在,我有一个名为 [内部时间] 的字段,它以小时为单位存储两个时间戳之间的持续时间。我想找到一种方法将它们成功转换为 HH:mm:ss 格式的时间值。

如下表所示,有些转换是正确的,而有些则相差甚远

内部时间 内部时间(持续时间)
47.7 23:42:00
8.2 8:12:00

我使用的解决方案基本上是将第 1 列除以 24。

完整公式如下。有很多条件,但对于任何将要满足的条件,该值将除以 24。

=(IF([Create Time]>[Finish Time], [Create Time]-[Finish Time],
IF(AND([Internal Time]>0, [Internal Time]-[Weekends] >0), [Internal Time]-'Raw Data'[Weekends],
IF(AND([Internal Time]>0, [Internal Time]-[Weekends] <=0), [Internal Time],
IF(AND([Internal Time]<0, [Actual Duration] >0), [Actual Duration],
IF([Internal Time]=0, [Finish Time] - [Create Time]))))))/24
Excel DAX PowerQuery 度量值

评论

1赞 Sam Nseir 11/14/2023
DAX 没有“Duration”数据类型。当持续时间始终小于 24 小时(一天)时,才能使用时间数据格式。在上面的示例中,第一行在技术上是正确的,但它缺少 1 天,即 1:23:42:00,dax 中不存在持续时间数据类型。此内部时间(持续时间)的总体场景或对象是什么?
0赞 Gian Carlo 11/14/2023
感谢您的回复。内部时间基本上是在导出时计算的,导出计算日期 1 和日期 2 之间的总小时数。这个字段有很多不一致的地方,这就是我求助于使用条件的原因。这可以在 M Query 中完成吗?我找到了下面描述的解决方案: =VAR _hours = INT([内部时间]) VAR _minutes = ROUND(([内部时间]-_hours)*60,0) RETURN _hours&“:”&_minutes&“:00” 虽然它确实返回正确的值,但生成的输出是文本格式,如果需要,不能在聚合中使用。
0赞 Sam Nseir 11/14/2023
为什么不保持原样呢?正如您所说,您希望将其保留为数字以进行计算。计算不正确?是的,最好在M Query(或Power Query)中执行此操作,但这取决于您拥有的内容以及要执行的操作。条件中的列/度量值是什么?用更多信息/细节更新您的上述问题,并给出明确的问题陈述。Internal TimeWEEKENDS

答:

1赞 Serge Inácio 11/14/2023 #1

这更像是一种解决方法。

注意:这仅在 31 天之前有效,如果有更多时间,则此计数器将重新启动。

它基于每月第一天的日期格式,在下面的示例中为 2000 年 1 月 1 日,并添加您的度量值 [内部时间]。然后,您可以通过显示天、小时、分钟和秒来使用它。

yourMeasure = 

VAR DateHelper = DATE(2000,1,1)

Return
DateHelper + 
DATE(
    YEAR([Internal Time]/24),
        MONTH([Internal Time]/24),
        DAY([Internal Time]/24)
    )+
TIME(
    HOUR([Internal Time]/24),
    MINUTE([Internal Time]/24),
    SECOND([Internal Time]/24)
)

将此度量值添加到表/矩阵后,请确保将格式更改为“d hh:mm:ss”

评论

0赞 Gian Carlo 11/14/2023
你好。这样做的问题是它不应该是文本格式。我有一个类似的解决方案,但最终没有使用,因为我无法使用它来聚合结果值: =VAR _hours = INT([内部时间]) VAR _minutes = ROUND(([内部时间]-_hours)*60,0) 返回 _hours&“:”&_minutes&“:00”
0赞 Serge Inácio 11/14/2023
我更新了它,所以可以格式化,但请注意。这更像是一种解决方法,最好是在查询编辑器中添加持续时间列。