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
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
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
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
Una solución general de matemáticas:
Dividir por 5, redondos al entero más próximo, luego se multiplica por 5.
uso durante la función
SELECT ROUND(FineAmount,5)
FROM tickets
El valor entero en la sobrecarga 'ROUND' es indicar precisión decimal, no múltiple para redondear. – paqogomez
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
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
Tenga en cuenta que "flotante de tipo de datos de operandos no es válido para el operador de módulo" –
Pero 10 redondeos es 10- (10% 5) +5 = 15 pero debe ser 10. – Marichyasana
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
¿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