2009-11-09 41 views
8

Tengo una columna Money en mi tabla de SQL Server 2008. En mi consulta a continuación cómo puedo redondear lo que más cercano a 5 $Redondea a 5 en SQL Server más cercano

select FineAmount from tickets 

Gracias

+1

¿Puede definir "más cercano"? Es decir, ¿qué resultado desea para los valores de 0, 1, 2.5 y 4? Redondear el dinero puede significar cosas diferentes según el caso de uso. – richardtallent

Respuesta

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

o poner Nicholaides sugerencia en SQL

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

el ejemplo se supone que es de tipo FineAmount dinero. El segundo enfoque es probablemente mejor que el primero trabaja con el límite de maximum_value_of_money_type/2

Más sobre ROUND

+0

La única nota que agregaría a esto es asegurarse de que divide el 5 como un decimal, no como un entero. puede envolverlo en un convert/cast o agregarle un 0 para asegurarse de que funciona correctamente. p. seleccionar ronda (FineAmount/5.0,0) * 5 de tickets – Sam

11

Una solución general de matemáticas:

Dividir por 5, redondos al entero más próximo, luego se multiplica por 5.

-8

uso durante la función

SELECT ROUND(FineAmount,5) 
    FROM tickets 
+1

El valor entero en la sobrecarga 'ROUND' es indicar precisión decimal, no múltiple para redondear. – paqogomez

0
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) 

- obtendrá 7818,30

2

Si desea truncar (redondear hacia abajo) a una agrupación de 5 usar la función de módulo; en Microsoft SQL Server esto es %

es decir: field1 - (field1% 5)

Si tuviera == campo1 3, entonces el Calc sería:

3 - (3% 5) = 0

si se tratara de 13:

13 - (13% 5) = 10

Basta con añadir 5 si desea reunir a

Véase también 'MOD' is not a recognized built-in function name

+0

Tenga en cuenta que "flotante de tipo de datos de operandos no es válido para el operador de módulo" –

+0

Pero 10 redondeos es 10- (10% 5) +5 = 15 pero debe ser 10. – Marichyasana

0

Mi primera solución era

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 

Esto funciona, pero es considerado por MSSQL como 'imprecisa', ya que utiliza números de punto flotante interno. Eso detiene su uso en vistas indexadas. En su lugar, puede hacer el trabajo solo con aritmética de enteros:

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