TSQL - 向上/向下舍入到最接近的秒

007*_*007 1 t-sql sql-server datetime date sql-server-2016

代码:

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
Run Code Online (Sandbox Code Playgroud)

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

GMB*_*GMB 5

投射到目标精度将为您处理舍入:

select cast(@var as datetimeoffset(0));
Run Code Online (Sandbox Code Playgroud)

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

select cast(cast(@var as datetimeoffset(0)) as datetimeoffset(7));
Run Code Online (Sandbox Code Playgroud)