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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:35:18