Power Query:超24小时文本时间转换及考勤工时计算问题
在Power Query中处理超24小时的文本格式考勤时间
核心问题说明
Power Query的Time类型仅支持00:00到23:59的范围,所以"2409"这类超24小时的文本无法直接转成Time,必须用**时长(Duration)**类型来存储,才能正常计算工时。下面提供两种实用方法:
方法1:拆分文本直接构建Duration
这种方法逻辑直观,自动补全不足4位的时间文本(比如"800"会补成"0800"):
- 在Power Query中选中时间文本列,点击「添加列」→「自定义列」
- 输入以下M代码(替换
[你的时间列名]为实际列名):
let PaddedText = Text.PadStart([你的时间列名], 4, "0"), Hours = Number.From(Text.Start(PaddedText, 2)), Minutes = Number.From(Text.End(PaddedText, 2)), WorkDuration = #duration(0, Hours, Minutes, 0) in WorkDuration
生成的WorkDuration是Duration类型,可直接用于工时加减计算。
方法2:模拟Excel的TEXT(@InTime,"00:00")+0逻辑
如果需要和Excel的计算逻辑完全对齐,可以模拟生成Excel的日期时间序列号,再转成Duration:
- 添加自定义列,输入以下代码(替换
[你的时间列名]):
let TimeStr = Text.Insert(Text.PadStart([你的时间列名], 4, "0"), 2, ":"), SerialValue = DateTimeValue("1899-12-30 " & TimeStr) - #datetime(1899, 12, 30, 0, 0, 0), WorkDuration = SerialValue in WorkDuration
- 代码中
1899-12-30是Excel的日期基准,计算后得到的SerialValue和Excel中TEXT+0的数值完全对应 - 如果需要得到和Excel一致的数字格式(1小时=1/24),可以用
Number.From(SerialValue)
后续工时计算示例
假设你有InDuration(上班时长)和OutDuration(下班时长)两列,计算实际工时只需添加自定义列:
[OutDuration] - [InDuration]
如果要把结果转成小时数,用:
Number.From([OutDuration] - [InDuration]) * 24
内容的提问来源于stack exchange,提问作者CLs
相关产品推荐
相关产品推荐

