如何在PowerQuery中向上/向下取整至最近的时/分/秒?
在Power Query中实现时间的向上/向下取整
一、向下取整(Floor)到指定单位
1. 取整到最近小时
核心是将时间转换为总秒数后,按1小时(3600秒)为单位整除,再转换回原类型:
// 针对Time类型 Time.From(Number.IntegerDivide(Time.ToTotalSeconds([TimeColumn]), 3600) * 3600 / 86400) // 针对DateTime类型 DateTime.From(Number.IntegerDivide(DateTime.ToTotalSeconds([DateTimeColumn]), 3600) * 3600 / 86400 + DateTime.ToNumber(Date.From([DateTimeColumn])))
2. 取整到最近分钟
以1分钟(60秒)为单位整除:
// Time类型 Time.From(Number.IntegerDivide(Time.ToTotalSeconds([TimeColumn]), 60) * 60 / 86400) // DateTime类型 DateTime.From(Number.IntegerDivide(DateTime.ToTotalSeconds([DateTimeColumn]), 60) * 60 / 86400 + DateTime.ToNumber(Date.From([DateTimeColumn])))
3. 取整到最近秒
直接向下取整总秒数即可:
// Time类型 Time.From(Number.RoundDown(Time.ToTotalSeconds([TimeColumn])) / 86400) // DateTime类型 DateTime.From(Number.RoundDown(DateTime.ToTotalSeconds([DateTimeColumn])) / 86400 + DateTime.ToNumber(Date.From([DateTimeColumn])))
二、向上取整(Ceiling)到指定单位
1. 取整到最近小时
将总秒数按小时单位向上取整后转换:
// Time类型 Time.From(Number.RoundUp(Time.ToTotalSeconds([TimeColumn]) / 3600) * 3600 / 86400) // DateTime类型 DateTime.From(Number.RoundUp(DateTime.ToTotalSeconds([DateTimeColumn]) / 3600) * 3600 / 86400 + DateTime.ToNumber(Date.From([DateTimeColumn])))
2. 取整到最近分钟
以分钟为单位向上取整:
// Time类型 Time.From(Number.RoundUp(Time.ToTotalSeconds([TimeColumn]) / 60) * 60 / 86400) // DateTime类型 DateTime.From(Number.RoundUp(DateTime.ToTotalSeconds([DateTimeColumn]) / 60) * 60 / 86400 + DateTime.ToNumber(Date.From([DateTimeColumn])))
3. 取整到最近秒
仅当时间包含毫秒时需要向上取整:
// Time类型 Time.From(Number.RoundUp(Time.ToTotalSeconds([TimeColumn])) / 86400) // DateTime类型 DateTime.From(Number.RoundUp(DateTime.ToTotalSeconds([DateTimeColumn])) / 86400 + DateTime.ToNumber(Date.From([DateTimeColumn])))
三、通用自定义函数(可复用)
可以创建统一的自定义函数,兼容不同类型和取整需求:
// 自定义时间取整函数:direction为"floor"或"ceiling",unit为"hour"/"minute"/"second" RoundTime = (input as any, direction as text, unit as text) as any => let isDateTime = Type.Is(Value.Type(input), type datetime), baseSeconds = if isDateTime then DateTime.ToTotalSeconds(input) else Time.ToTotalSeconds(input), unitSeconds = if unit = "hour" then 3600 else if unit = "minute" then 60 else if unit = "second" then 1 else error "无效的单位,可选值:hour/minute/second", roundedSeconds = if direction = "floor" then Number.IntegerDivide(baseSeconds, unitSeconds) * unitSeconds else if direction = "ceiling" then Number.RoundUp(baseSeconds / unitSeconds) * unitSeconds else error "无效的方向,可选值:floor/ceiling", result = if isDateTime then DateTime.From(roundedSeconds / 86400 + DateTime.ToNumber(Date.From(input))) else Time.From(roundedSeconds / 86400) in result
使用示例:
// 将DateTime向下取整到小时 RoundTime([DateTimeColumn], "floor", "hour") // 将Time向上取整到分钟 RoundTime([TimeColumn], "ceiling", "minute")
内容的提问来源于stack exchange,提问作者chrimaho
相关产品推荐
相关产品推荐

