От округления до ближайшего 5 в SQL Server

У меня есть столбец Money в моей таблице SQL Server 2008. В моем следующем запросе, как я могу округлить его до ближайшего 5 $

select FineAmount from tickets

Спасибо

Ответ 1

select round(FineAmount*2,-1)/2 from tickets

или поставить предложение nicholaides в sql

select round(FineAmount/5,0)*5 from tickets

В примере предполагается, что FineAmount имеет тип денег. Второй подход, вероятно, лучше, так как первый работает с лимитом maximum_value_of_money_type/2

Подробнее о ROUND

Ответ 2

Общее математическое решение:

Разделите на 5, округлите до ближайшего целого числа, затем умножьте на 5.

Ответ 3

Если вы хотите усечь (округлить) до группировки 5, используйте функцию modulo; в Microsoft SQL Server это %

т.е.: field1 - (field1% 5)

Если у вас есть поле1 == 3, то вычислено:

3 - (3% 5) = 0

если это было 13:

13 - (13% 5) = 10

Просто добавьте 5, если вы хотите округлить

См. также 'MOD' не является признанным встроенным именем функции

Ответ 4

DECLARE @Amount DECIMAL(18,3) ; SET @Amount = 7818.32

SELECT(Round((@Amount-CAST(@Amount AS INT))*100 /5,0)*5 /100) 
      + CAST( @Amount AS INT)

- вы получите 7818.30

Ответ 5

Мое первое решение было

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 [email protected] else @r end

end

Ответ 6

Раунд к следующему большему 5

(CAST(@Amount/5 AS INT) + IIF(CAST(ROUND(@Amount,0) AS INT) % 5>1,1,0))*5)

Ответ 7

Использовать функцию ROUND

    SELECT  ROUND(FineAmount,5)
    FROM    tickets