Pregunta

Estoy tratando de determinar la mejor manera de truncar o eliminar decimales adicionales en SQL sin redondear.Por ejemplo:

declare @value decimal(18,2)

set @value = 123.456

Esto redondeará automáticamente @value ser 123.46, lo cual es bueno en la mayoría de los casos.Sin embargo, para este proyecto, no necesito eso.¿Existe una forma sencilla de truncar los decimales que no necesito?Sé que puedo usar el left() función y convertirla nuevamente a decimal.¿Hay otras maneras?

¿Fue útil?

Solución

select round(123.456, 2, 1)

Otros consejos

ROUND ( 123.456 , 2 , 1 )

Cuando el tercer parámetro != 0 se trunca en lugar de redondearse

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Sintaxis

REDONDEAR (expresión_numérica, longitud [, función])

Argumentos

  • expresión_numéricaEs una expresión de la categoría de tipo de datos numérico numérico o aproximado exacto, excepto el tipo de datos de bits.

  • longitudEs la precisión con la que se redondeará la expresión_numérica.length debe ser una expresión de tipo tinyint, smallint o int.Cuando la longitud es un número positivo, la expresión numérica se redondea al número de posiciones decimales especificadas por la longitud.Cuando la longitud es un número negativo, la expresión_numérica se redondea en el lado izquierdo del punto decimal, según lo especificado por la longitud.

  • funciónEs el tipo de operación a realizar.La función debe ser tinyint, smallint o int.Cuando la función se omite o tiene un valor de 0 (predeterminado), la expresión numérica se redondea.Cuando se especifica un valor distinto de 0, se trunca la expresión_numérica.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

Así es como pude truncar y no redondear:

select 100.0019-(100.0019%.001)

devuelve 100.0010

Y tu ejemplo:

select 123.456-(123.456%.001)

devuelve 123.450

Ahora, si quieres deshacerte del cero final, simplemente échalo:

select cast((123.456-(123.456%.001)) as decimal (18,2))

devuelve 123,45

En realidad, sea cual sea el tercer parámetro, 0, 1 o 2, no redondeará su valor.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

La ronda tiene un parámetro opcional.

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

Otro truncamiento sin solución y ejemplo de redondeo.

    Convert 71.950005666 to a single decimal place number (71.9)
    1) 71.950005666 * 10.0 = 719.50005666
    2) Floor(719.50005666) = 719.0
    3) 719.0 / 10.0 = 71.9

    select Floor(71.950005666 * 10.0) / 10.0

¿Quieres el decimal o no?

Si no, usa

select ceiling(@value),floor(@value)

Si lo haces con 0 entonces haz una vuelta:

select round(@value,2)

Esto eliminará la parte decimal de cualquier número.

SELECT ROUND(@val,0,1)

Sé que esto es bastante tarde, pero no lo veo como una respuesta y he estado usando este truco durante años.

Simplemente reste .005 de su valor y use Round(@num,2).

Tu ejemplo:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

devuelve 123,45

Ajustará automáticamente el redondeo al valor correcto que está buscando.

Por cierto, ¿estás recreando el programa de la película Office Space?

Intente utilizar este código para convertir 3 valores decimales después de un punto en 2 decimales:

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

La salida es 123,46

Creo que solo quieres el valor decimal, en este caso puedes usar lo siguiente:

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)

Otra forma es ODBC TRUNCATE función:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

Producción:

╔═════════╦═════════╗
║   val   ║ result  ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝

Observación:

Recomiendo usar incorporado ROUND función con el tercer parámetro establecido en 1.

Sé que esta pregunta es muy antigua, pero nadie usó subcadenas para redondear.Esto es una ventaja de la capacidad de redondear números muy largos (el límite de su cadena en el servidor SQL, que suele ser de 8000 caracteres):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)

Mod(x,1) Es la forma más fácil, creo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top