DirectQuery模式下Power BI DateTime转12小时制Time字段方案问询
针对Power BI时间维度拆分的解决方案
方案1:实现12小时制显示且保留Time类型(DirectQuery兼容)
SQL中的TIME类型本身不存储显示格式,格式控制属于展示层操作。你可以通过以下步骤实现需求:
- SQL层返回标准Time类型
继续使用能被Power BI正确识别为Time类型的语句:CAST(Create_DateTime AS TIME) AS Create_Time - Power BI端设置显示格式
在DirectQuery模式下,无法修改列的数据类型,但可以调整显示格式:- 切换到数据视图,选中
Create_Time列 - 打开建模选项卡,找到格式下拉菜单
- 选择
hh:mm:ss tt格式,Power BI会自动以12小时制带AM/PM的样式显示,同时保留Time类型用于时间维度分析。
- 切换到数据视图,选中
方案2:优化Power Query代码适配24小时制时间维度
若你选择使用24小时制,以下是精简后的Power Query代码(移除了原代码中的冗余操作,保留所有必要的时间分组维度):
let Source = List.Times(#time(0,0,0),24*60*60,#duration(0,0,0,1)), #"转换为表" = Table.FromList(Source, Splitter.SplitByNothing()), #"重命名列" = Table.RenameColumns(#"转换为表",{{"Column1", "Time"}}), #"更改类型" = Table.TransformColumnTypes(#"重命名列",{{"Time", type time}}), #"添加小时" = Table.AddColumn(#"更改类型", "Hour", each Time.Hour([Time]), Int64.Type), #"添加分钟" = Table.AddColumn(#"添加小时", "Minute", each Time.Minute([Time]), Int64.Type), #"添加秒" = Table.AddColumn(#"添加分钟", "Second", each Time.Second([Time]), type number), #""添加AM/PM"" = Table.AddColumn(#"添加秒", "AM/PM", each if [Hour] < 12 then "a.m." else "p.m.", type text), #""格式化小时标签"" = Table.AddColumn(#""添加AM/PM"", "Hour Label", each Text.PadStart(Text.From([Hour]), 2, "0"), type text), #""格式化分钟标签"" = Table.AddColumn(#""格式化小时标签"", "Minute Label", each Text.PadStart(Text.From([Minute]), 2, "0"), type text), #""格式化秒标签"" = Table.AddColumn(#""格式化分钟标签"", "Second Label", each Text.PadStart(Text.From([Second]), 2, "0"), type text), #"添加时间键" = Table.AddIndexColumn(#""格式化秒标签"", "TimeKey", 0, 1), #""12小时制小时分组"" = Table.AddColumn(#"添加时间键", "Hour Bin 12", each Number.Mod([Hour], 12), type number), #""8小时分组"" = Table.AddColumn(#""12小时制小时分组"", "Hour Bin 8", each Number.IntegerDivide([Hour], 8), Int64.Type), #""6小时分组"" = Table.AddColumn(#""8小时分组"", "Hour Bin 6", each Number.IntegerDivide([Hour], 6), Int64.Type), #""4小时分组"" = Table.AddColumn(#""6小时分组"", "Hour Bin 4", each Number.IntegerDivide([Hour], 4), Int64.Type), #""3小时分组"" = Table.AddColumn(#""4小时分组"", "Hour Bin 3", each Number.IntegerDivide([Hour], 3), Int64.Type), #""2小时分组"" = Table.AddColumn(#""3小时分组"", "Hour Bin 2", each Number.IntegerDivide([Hour], 2), Int64.Type), #""30分钟分组"" = Table.AddColumn(#""2小时分组"", "Minute Bin 30", each Number.IntegerDivide([Minute], 30)*30, type number), #""15分钟分组"" = Table.AddColumn(#""30分钟分组"", "Minute Bin 15", each Number.IntegerDivide([Minute], 15)*15, type number), #""10分钟分组"" = Table.AddColumn(#""15分钟分组"", "Minute Bin 10", each Number.IntegerDivide([Minute], 10)*10, type number) in #""10分钟分组""
代码优化说明:
- 移除了原代码中冗余的列复制/删除操作
- 使用
Text.PadStart替代前缀添加+截取字符的复杂逻辑,代码更简洁 - 合并了分组列的计算步骤,减少中间操作
- 保留原代码所有时间维度分组,可直接与事实表的24小时制Time字段关联
内容的提问来源于stack exchange,提问作者NutellaKing
相关产品推荐
相关产品推荐

