Domanda

Sto cercando di determinare il modo migliore per troncare o eliminare cifre decimali aggiuntive in SQL senza arrotondare.Per esempio:

declare @value decimal(18,2)

set @value = 123.456

Questo verrà arrotondato automaticamente @value essere 123.46, il che è positivo nella maggior parte dei casi.Tuttavia, per questo progetto, non ne ho bisogno.Esiste un modo semplice per troncare i decimali che non mi servono?So che posso usare il left() funzione e riconvertirla in un numero decimale.Ci sono altri modi?

È stato utile?

Soluzione

select round(123.456, 2, 1)

Altri suggerimenti

ROUND ( 123.456 , 2 , 1 )

Quando il terzo parametro != 0 tronca anziché arrotondare

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

Sintassi

ROUND (espressione_numerica, lunghezza [,funzione])

argomenti

  • espressione_numericaÈ un'espressione della categoria del tipo di dati numerici nervoso o approssimativo esatto, ad eccezione del tipo di dati bit.

  • lunghezzaPrecisione con cui arrotondare numeric_expression.length deve essere un'espressione di tipo tinyint, smallint o int.Quando length è un numero positivo, numeric_expression viene arrotondato al numero di posizioni decimali specificate da length.Quando length è un numero negativo, numeric_expression viene arrotondato al lato sinistro del separatore decimale, come specificato da length.

  • funzioneTipo di operazione da eseguire.la funzione deve essere tinyint, smallint o int.Quando funzione viene omessa o ha un valore pari a 0 (impostazione predefinita), numeric_expression viene arrotondato.Quando viene specificato un valore diverso da 0, numeric_expression viene troncato.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

Ecco il modo in cui sono riuscito a troncare e non arrotondare:

select 100.0019-(100.0019%.001)

restituisce 100.0010

E il tuo esempio:

select 123.456-(123.456%.001)

restituisce 123.450

Ora se vuoi sbarazzarti dello zero finale, lancialo semplicemente:

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

restituisce 123,45

In realtà qualunque sia il terzo parametro, 0 o 1 o 2, non arrotonderà il tuo valore.

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

Round ha un parametro facoltativo

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

Un altro troncato senza soluzione ed esempio di arrotondamento.

    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

Vuoi la virgola o no?

In caso contrario, utilizzare

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

Se lo fai con 0, fai un giro:

select round(@value,2)

Ciò rimuoverà la parte decimale di qualsiasi numero

SELECT ROUND(@val,0,1)

So che è piuttosto tardi, ma non la vedo come una risposta e utilizzo questo trucco da anni.

Sottrai semplicemente .005 dal tuo valore e usa Round(@num,2).

Il tuo esempio:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

restituisce 123,45

Adeguerà automaticamente l'arrotondamento al valore corretto che stai cercando.

A proposito, stai ricreando il programma del film Office Space?

Prova a utilizzare questo codice per convertire 3 valori decimali dopo la virgola in 2 cifre decimali:

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

select @val

L'output è 123,46

Penso che tu voglia solo il valore decimale, in questo caso puoi usare quanto segue:

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

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

Un altro modo è ODBC TRUNCATE funzione:

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

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

LiveDemo

Produzione:

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

Nota:

Consiglio di utilizzare built-in ROUND funzione con il 3° parametro impostato a 1.

So che questa domanda è davvero vecchia ma nessuno ha usato le sottostringhe per arrotondare.Questo offre il vantaggio della possibilità di arrotondare numeri molto lunghi (limite della stringa nel server SQL che di solito è di 8000 caratteri):

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

Mod(x,1) è il modo più semplice, credo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top