Tronca (non arrotondare) le posizioni decimali in SQL Server


194

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

declare @value decimal(18,2)

set @value = 123.456

Questo verrà automaticamente rotonda @valuedi essere 123.46, che è buono nella maggior parte dei casi. Tuttavia, per questo progetto, non ne ho bisogno. C'è un modo semplice per troncare i decimali che non mi servono? So che posso usare la left()funzione e riconvertire in un decimale. Ci sono altri modi?

Risposte:


188
select round(123.456, 2, 1)

27
La risposta dovrebbe spiegare quali sono i parametri della funzione
Tyler,

9
SQL ROUND (numero, decimali, operazione): operazione -> Se 0, arrotonda il risultato al numero di decimali. Se un valore diverso da 0, tronca il risultato al numero di decimali. L'impostazione predefinita è 0
Midhun Darvin

sei un salvavita, ho avuto un importo per mostrare solo le ultime due cifre "1.9991666", tuttavia ha sempre arrotondato per eccesso a 2 indipendentemente da quello che uso, con questo sono in grado di ottenere qualcosa di simile - selezionare FORMATO (rotondo (1.9991666 , 2, 1), 'N2') COME 'Vota', Grazie amico
Spider,

269
ROUND ( 123.456 , 2 , 1 )

Quando il terzo parametro ! = 0 viene troncato anziché arrotondato

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

Sintassi

ROUND ( numeric_expression , length [ ,function ] )

argomenti

  • numeric_expression Espressione della categoria esatta di tipi di dati numerici o approssimativi, ad eccezione del tipo di dati bit.

  • length Precisione con cui arrotondare numeric_expression. lunghezza deve essere un'espressione di tipo tinyint, smallint o int. Quando la lunghezza è un numero positivo, numeric_expression viene arrotondato al numero di posizioni decimali specificato dalla lunghezza. Quando la lunghezza è un numero negativo, numeric_expression viene arrotondato sul lato sinistro del punto decimale, come specificato dalla lunghezza.

  • function È il tipo di operazione da eseguire. la funzione deve essere smallint, smallint o int. Quando la 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.

Qualcuno sa quali valori per l'argomento della funzione corrispondono a tinyint, smallint e int? Microsoft ha lasciato quella parte fuori dalla loro documentazione e non riesce a trovare la risposta da nessuna parte. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave,

SERVER MS SQL arrotonda i numeri in modo leggermente diverso da IQ. Per risolvere usa la funzione round (x, y, z) in questo modo (val1 / val2,4,1)
Warren LaFrance

37
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

13

Ecco il modo in cui sono stato in grado di 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


10

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

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

Non capisco questa risposta. Il dato SQL risulta in 10.01, ovvero un arrotondamento corretto di 10,0055 con due decimali. Se il parametro finale non è 0, il valore viene troncato (al secondo decimale) a 10,00.
8128

7

Round ha un parametro opzionale

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

3
Selezionare il round (123.456, 2, 1) sarà = 123.450
Bikram

4
Non vedo perché questo ottenga voti. Quanto sopra ti darà 123.450 e 123.460 rispettivamente.
remykarem,

7

Vuoi il decimale o no?

In caso contrario, utilizzare

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

Se lo fai con 0, fai un round:

select round(@value,2)

1
Scusate se non sono stato chiaro, ho bisogno di mantenere le cifre decimali, lascia cadere quelle che non voglio. Ad esempio, invece di 123.456 nel mio esempio sopra convertito in 123.46 ... Voglio eliminare il terzo decimale e renderlo 123,45.
Ryan Eastabrook,

6

Un altro troncato senza soluzione di arrotondamento ed esempio.

    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

2
+1 per il Floor()quale è la strada da percorrere per eliminare i decimali senza arrotondare. Peccato Floor () non ha un secondo parametro per indicare in quale posizione. Ma penso che * 10) / 10 funzioni abbastanza bene.
derby il

4

Ciò rimuoverà la parte decimale di qualsiasi numero

SELECT ROUND(@val,0,1)

2
Non è così. SELEZIONA ROUND (123.4560,0,1) ti dà invece 123.0000.
remykarem,

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Ti darebbe 2 valori dopo il punto decimale. (MS SQL SERVER)


1

Un altro modo è la ODBC TRUNCATEfunzione:

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 
╚═════════╩═════════╝

Commento:

Consiglio di utilizzare la ROUNDfunzione integrata con il 3o parametro impostato su 1.


1
Funzione scalare ODBC - Alternativa diversa!
Arulmouzhi,

1

So che è piuttosto tardi, ma non lo vedo come una risposta e uso 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

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

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


0

Prova a utilizzare questo codice per convertire 3 valori decimali dopo un punto in 2 posizioni decimali:

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

select @val

L'output è 123,46


1) La terza riga è completamente superflua 2) ha detto esplicitamente di non voler arrotondare il numero, ma di troncarlo (il risultato dovrebbe essere 123,45)
Damián Pablo González,

0

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)

0

So che questa domanda è davvero vecchia ma nessuno ha usato le sottostringhe per arrotondare. Questo a 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)

0

Penso che possiamo andare molto più facilmente con la soluzione di esempio più semplice trovata in Hackerrank:

Dichiarazione del problema: richiedi a STATION il valore più grande delle latitudini settentrionali (LAT_N) inferiore a 137.2345. Tronca la tua risposta al 4 ° decimale.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

La soluzione sopra ti dà l'idea di come rendere il valore limitato a 4 decimali. Se vuoi abbassare o aumentare i numeri dopo i decimali, cambia 4 in quello che vuoi.


-3

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


-5
select convert(int,@value)

1
Non è quello che voleva l'OP. Vuole ancora i decimali, ma vuole rimuoverli (troncati) piuttosto che arrotondarli. IE 123.456 -> 123.45 NON 123.456 -> 12.46 e NON 123.456 -> 123
Giovanni,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.