Sql server TSQL-向上/向下取整至最接近的秒数

Sql server TSQL-向上/向下取整至最接近的秒数,sql-server,tsql,date,datetime,sql-server-2016,Sql Server,Tsql,Date,Datetime,Sql Server 2016,代码: 目标: 我想根据毫秒=5四舍五入到最接近的秒数。到目前为止,我的查询确实正确地对秒进行了舍入,只是没有将精度舍入到我想要的0000000。转换到目标精度将为您处理舍入: DECLARE @var DATETIMEOFFSET(7) ; -- Rounding up SET @var = '2020-03-20 12:00:29.9999999 -08:00' ; SELECT DATEADD ( ms, 500 - DATEPART ( ms, DATEADD ( MILLISECO

代码:

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

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

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
如果仍希望结果为datetimeoffset7,则可以强制转换两次:


铸造到目标精度将为您处理舍入:

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
如果仍希望结果为datetimeoffset7,则可以强制转换两次:


这个解决方案非常简单,我非常喜欢。是否会出现性能问题?表中有数百万行,我需要在多个字段上执行此操作。@007:我希望这是一种有效的转换方法。但将一个函数应用于许多行仍然很昂贵。此解决方案非常简单,我非常喜欢。是否会出现性能问题?表中有数百万行,我需要在多个字段上执行此操作。@007:我希望这是一种有效的转换方法。但将一个函数应用于许多行仍然很昂贵。
select cast(cast(@var as datetimeoffset(0)) as datetimeoffset(7));