Мое первое решение было
create function dbo.udf_RoundToNearest(@x int, @to int)
returns int
with schemabinding as begin
return @to * convert(int, round(convert(float, @x) / convert(float, @to), 0))
end
Это работает, но MSSQL считается «неточным», поскольку оно использует числа с плавающей запятой внутри. Это останавливает его использование в индексированных представлениях. Вместо этого вы можете выполнять работу только с целочисленной арифметикой:
create function dbo.udf_RoundToNearest(@x int, @to int)
returns int
with schemabinding as begin
declare @m int
set @m = abs(@x) % abs(@to)
declare @trunc int
set @trunc = abs(@x) - @m
declare @r int
set @r = case when @m * 2 >= abs(@to) then @trunc + abs(@to) else @trunc end
return case when @x < 0 then -@r else @r end
end