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
相关产品推荐
相关产品推荐

