【问题标题】:TSQL - Round up/down to nearest SECONDTSQL - 向上/向下舍入到最接近的 SECOND
【发布时间】:2020-07-01 20:59:20
【问题描述】:

代码:

DECLARE @var DATETIMEOFFSET(7) ;

-- Rounding up
SET @var = '2020-03-20 12:00:29.9999999 -08:00' ;
SELECT  DATEADD ( ms, 500 - DATEPART ( ms, DATEADD ( MILLISECOND, 500, @var )), @var ) ;
-- Actual: 2020-03-20 12:00:30.0009999 -08:00
-- Expected: 2020-03-20 12:00:30.0000000 -08:00 -- Notice that precision is rounded up to '0000000'

-- Rounding down
SET @var = '2020-03-20 12:00:30.0000001 -08:00' ;
SELECT  DATEADD ( ms, 500 - DATEPART ( ms, DATEADD ( MILLISECOND, 500, @var )), @var ) ;
-- Actual: 2020-03-20 12:00:30.0000001 -08:00
-- Expected: 2020-03-20 12:00:30.0000000 -08:00 -- Notice that precision is rounded down to '0000000'
GO

目标: 我想根据毫秒 = 5###### 四舍五入到最接近的秒数。到目前为止,我的查询确实正确地将秒数四舍五入,只是没有将精度四舍五入到我想要的 0000000。

【问题讨论】:

    标签: sql-server tsql date datetime sql-server-2016


    【解决方案1】:

    转换为目标精度将为您处理舍入:

    select cast(@var as datetimeoffset(0));
    

    如果您仍然想要datetimeoffset(7) 的结果,那么您可以cast 两次:

    select cast(cast(@var as datetimeoffset(0)) as datetimeoffset(7));
    

    【讨论】:

    • 我非常喜欢这个解决方案的简单性。是否会出现性能问题(表有数百万行,我需要在多个字段上执行此操作)。
    • @007:我希望这应该是一种有效的转换方法。但是将函数应用于多行仍然很昂贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多