Domanda Arrotonda al 5 più vicino in SQL Server


Ho una colonna Money nella mia tabella SQL Server 2008. Nella mia domanda qui sotto come posso arrotondarlo al 5 $ più vicino

select FineAmount from tickets

Grazie


10
2017-11-09 16:21


origine


risposte:


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

o per mettere la suggestione di nicholaides in sql

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

Nell'esempio si presuppone che FineAmount sia di tipo money. Il secondo approccio è probabilmente migliore in quanto il primo funziona con il limite di maximum_value_of_money_type / 2

Più su IL GIRO


21
2017-11-09 16:32



Una soluzione matematica generale:

Dividere per 5, arrotondare al numero intero più vicino, quindi moltiplicare per 5.


13
2017-11-09 16:24



Se si desidera troncare (arrotondato) a un gruppo di 5, utilizzare la funzione modulo; questo è in Microsoft SQL Server %

vale a dire: field1 - (field1 % 5)

Se avessi field1 == 3, il calcolo sarebbe:

3 - (3% 5) = 0

se fosse 13:

13 - (13% 5) = 10

Aggiungi 5 se vuoi arrotondare

Guarda anche 'MOD' non è un nome di funzione predefinito riconosciuto


3
2018-01-08 17:03



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)

-- otterrai 7.818,30


0
2018-01-20 15:50



La mia prima soluzione è stata

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

Questo funziona, ma è considerato da MSSQL come "impreciso" poiché utilizza internamente numeri a virgola mobile. Ciò impedisce che venga utilizzato nelle visualizzazioni indicizzate. Puoi invece eseguire il lavoro solo con l'aritmetica dei numeri interi:

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

0
2017-09-07 11:44



Usa la funzione ROUND

    SELECT  ROUND(FineAmount,5)
    FROM    tickets

-8
2017-11-09 16:28