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

T-SQL如何高效优雅地将时间截断到分钟(不四舍五入)

T-SQL 时间截断到分钟(无四舍五入)最优实现方案

问题原因说明

原有代码出现向上取整的核心原因是:CAST(时间字段 AS TIME(0))在转换时会按照TIME(0)的精度(保留到整数秒)执行四舍五入规则,当秒数≥0.5时会触发分钟进位,无法实现截断效果。

最优实现方案

方案1:高版本SQL Server(2022+ / Azure SQL)最优雅写法

直接使用内置函数DATETRUNC,原生支持按时间单位截断,无额外计算开销,可读性最高:

SELECT
    CAST('2021-09-02T15:15:30.9233333' AS datetime2(7)) AS EventDatetime2,
    -- 截断到分钟后保留完整日期时间
    DATETRUNC(minute, CAST('2021-09-02T15:15:30.9233333' AS datetime2(7))) AS TruncatedDatetime,
    -- 仅保留截断后的时间部分
    CAST(DATETRUNC(minute, CAST('2021-09-02T15:15:30.9233333' AS datetime2(7))) AS TIME) AS TruncatedTime

方案2:全版本兼容最高效写法

适用于所有SQL Server版本,仅用日期函数运算,无字符串转换开销,性能拉满:
核心逻辑:先计算从基准日期到当前时间的总分钟整数差,再把这个分钟差加回基准日期,自动抹除秒及以下精度的数值,完全无四舍五入。

SELECT
    CAST('2021-09-02T15:15:30.9233333' AS datetime2(7)) AS EventDatetime2,
    -- 截断到分钟后保留完整日期时间
    DATEADD(minute, DATEDIFF(minute, 0, CAST('2021-09-02T15:15:30.9233333' AS datetime2(7))), 0) AS TruncatedDatetime,
    -- 仅保留截断后的时间部分
    CAST(DATEADD(minute, DATEDIFF(minute, 0, CAST('2021-09-02T15:15:30.9233333' AS datetime2(7))), 0) AS TIME) AS TruncatedTime

结果验证

以上两种方案对示例输入2021-09-02T15:15:30.9233333的输出均为15:15:00,不会进位为15:16,完全符合截断需求。

内容的提问来源于stack exchange,提问作者Jason Horner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:30:02