T SQL - округление вверх / вниз до ближайшей второй - PullRequest
1 голос
/ 20 марта 2020

Код:

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 ###### или миллисекундах> = 5 ######. На данный момент мой запрос правильно округляет секунды, просто он не округляет точность до того, что я хочу, 0000000.

1 Ответ

5 голосов
/ 20 марта 2020

Приведение к целевой точности будет обрабатывать округление для вас:

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

Если вы все еще хотите получить результат как datetimeoffset(7), то вы можете cast дважды:

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