Schneiden Sie (nicht runde) Dezimalstellen in SQL Server ab


194

Ich versuche herauszufinden, wie zusätzliche Dezimalstellen in SQL am besten abgeschnitten oder gelöscht werden können, ohne zu runden. Beispielsweise:

declare @value decimal(18,2)

set @value = 123.456

Dies wird automatisch rund @valuezu sein 123.46, was gut in den meisten Fällen. Für dieses Projekt brauche ich das jedoch nicht. Gibt es eine einfache Möglichkeit, die nicht benötigten Dezimalstellen abzuschneiden? Ich weiß, dass ich die left()Funktion verwenden und zurück in eine Dezimalzahl konvertieren kann . Gibt es noch andere Möglichkeiten?

Antworten:


188
select round(123.456, 2, 1)

27
Die Antwort sollte erklären, was die Parameter der Funktion sind
Tyler

9
SQL ROUND (Zahl, Dezimalstellen, Operation): Operation -> Wenn 0, wird das Ergebnis auf die Dezimalzahl gerundet. Wenn ein anderer Wert als 0 vorliegt, wird das Ergebnis auf die Anzahl der Dezimalstellen gekürzt. Standard ist 0
Midhun Darvin

Sie sind ein Lebensretter, ich hatte einen Betrag, um nur die letzten beiden Ziffern "1.9991666" anzuzeigen, aber es wurde immer auf 2 aufgerundet, egal was ich benutze, damit kann ich so etwas erreichen - wählen Sie FORMAT (rund (1.9991666) , 2, 1), 'N2') AS 'Rate', Danke Kumpel
Spider

269
ROUND ( 123.456 , 2 , 1 )

Wenn der dritte Parameter ! = 0 ist, wird er eher abgeschnitten als gerundet

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

Syntax

ROUND ( numeric_expression , length [ ,function ] )

Argumente

  • numeric_expression Ist ein Ausdruck der exakten numerischen oder ungefähren numerischen Datentypkategorie mit Ausnahme des Bitdatentyps.

  • length Ist die Genauigkeit, mit der numerischer_Ausdruck gerundet werden soll. Länge muss ein Ausdruck vom Typ tinyint, smallint oder int sein. Wenn die Länge eine positive Zahl ist, wird numeric_expression auf die durch die Länge angegebene Anzahl von Dezimalstellen gerundet. Wenn die Länge eine negative Zahl ist, wird numeric_expression auf der linken Seite des Dezimalpunkts gerundet, wie durch die Länge angegeben.

  • function Ist die Art der auszuführenden Operation. Die Funktion muss tinyint, smallint oder int sein. Wenn die Funktion weggelassen wird oder den Wert 0 hat (Standard), wird numeric_expression gerundet. Wenn ein anderer Wert als 0 angegeben wird, wird numeric_expression abgeschnitten.

Weiß jemand, welche Werte für das Funktionsargument tinyint, smallint und int entsprechen? Microsoft hat diesen Teil aus der Dokumentation herausgelassen und kann die Antwort nirgendwo finden. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave

MS SQL SERVER rundet Zahlen etwas anders als IQ. Um dies zu beheben, verwenden Sie die Funktion runde (x, y, z) wie diese Runde (val1 / val2,4,1)
Warren LaFrance

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

13

Hier ist die Art und Weise, wie ich abschneiden und nicht runden konnte:

select 100.0019-(100.0019%.001)

gibt 100.0010 zurück

Und dein Beispiel:

select 123.456-(123.456%.001)

gibt 123.450 zurück

Wenn Sie nun die Endnull loswerden möchten, werfen Sie sie einfach um:

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

gibt 123,45 zurück


10

Unabhängig vom dritten Parameter, 0 oder 1 oder 2, wird Ihr Wert nicht gerundet.

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

Ich verstehe diese Antwort nicht. Die angegebene SQL ergibt 10.01, was einer korrekten Rundung von 10.0055 auf zwei Dezimalstellen entspricht. Wenn der letzte Parameter nicht 0 ist, wird der Wert auf 10,00 abgeschnitten (auf 2 Dezimalstellen).
8128

7

Round hat einen optionalen Parameter

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

3
Wählen Sie Runde (123.456, 2, 1) wird = 123.450
Bikram

4
Ich verstehe nicht, warum dies positive Stimmen bekommt. Das Obige gibt Ihnen 123.450 bzw. 123.460.
Remykarem

7

Willst du die Dezimalstelle oder nicht?

Wenn nicht, verwenden Sie

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

Wenn Sie es mit 0 machen, dann machen Sie eine Runde:

select round(@value,2)

1
Es tut mir leid, wenn ich nicht klar war, ich muss die Dezimalstellen behalten, einfach diejenigen fallen lassen, die ich nicht will. Zum Beispiel, anstatt 123.456 in meinem obigen Beispiel in 123.46 konvertiert zu werden ... möchte ich die dritte Dezimalstelle löschen und sie auf 123.45 setzen.
Ryan Eastabrook

6

Ein weiteres Abschneiden ohne Rundungslösung und Beispiel.

    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 Floor()ist der Weg, um Dezimalstellen fallen zu lassen, ohne tatsächlich zu runden. Schade, dass Floor () keinen zweiten Parameter hat, der angibt, an welcher Position. Aber ich denke, die * 10) / 10 funktioniert in der Tat ganz gut.
Deroby

4

Dadurch wird der Dezimalteil einer beliebigen Zahl entfernt

SELECT ROUND(@val,0,1)

2
Es tut nicht. SELECT ROUND (123.4560,0,1) gibt Ihnen stattdessen 123.0000.
Remykarem

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

Würde Ihnen 2 Werte nach dem Dezimalpunkt geben. (MS SQL SERVER)


1

Ein anderer Weg ist die ODBC TRUNCATEFunktion:

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

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

LiveDemo

Ausgabe:

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

Anmerkung:

Ich empfehle die integrierte ROUNDFunktion mit dem 3. Parameter auf 1.


1
ODBC-Skalarfunktion - andere Alternative!
Arulmouzhi

1

Ich weiß, dass dies ziemlich spät ist, aber ich sehe es nicht als Antwort und benutze diesen Trick seit Jahren.

Subtrahieren Sie einfach 0,005 von Ihrem Wert und verwenden Sie Round (@ num, 2).

Ihr Beispiel:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

gibt 123,45 zurück

Die Rundung wird automatisch auf den richtigen Wert eingestellt, den Sie suchen.

Erstellen Sie das Programm übrigens aus dem Film Office Space neu?


0

Bitte versuchen Sie, diesen Code zum Konvertieren von 3 Dezimalwerten nach einem Punkt in 2 Dezimalstellen zu verwenden:

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

select @val

Die Ausgabe ist 123,46


1) Die dritte Zeile ist völlig unnötig. 2) Er sagte ausdrücklich, er wolle die Zahl nicht runden, sondern abschneiden (das Ergebnis sollte 123,45 sein)
Damián Pablo González

0

Ich denke, Sie möchten nur den Dezimalwert, in diesem Fall können Sie Folgendes verwenden:

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

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

0

Ich weiß, dass diese Frage wirklich alt ist, aber niemand hat Teilstrings zum Runden verwendet. Dies ist ein Vorteil für die Möglichkeit, wirklich lange Zahlen zu runden (Begrenzung Ihrer Zeichenfolge in SQL Server beträgt normalerweise 8000 Zeichen):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

Ich denke, wir können mit einer einfacheren Beispiellösung in Hackerrank viel einfacher vorgehen:

Problemstellung: Fragen Sie den größten Wert der nördlichen Breiten (LAT_N) von STATION ab, der kleiner als 137,2345 ist. Kürzen Sie Ihre Antwort auf 4 Dezimalstellen.

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

Die obige Lösung gibt Ihnen eine Vorstellung davon, wie Sie den Wert einfach auf 4 Dezimalstellen beschränken können. Wenn Sie die Zahlen nach der Dezimalstelle senken oder erhöhen möchten, ändern Sie einfach 4 nach Ihren Wünschen.


-3

Mod(x,1) ist der einfachste Weg, denke ich.


-5
select convert(int,@value)

1
Das wollte das OP nicht. Er möchte immer noch Dezimalstellen, aber er möchte sie entfernen (truncte), anstatt sie zu runden. IE 123.456 -> 123.45 NICHT 123.456 -> 12.46 und NICHT 123.456 -> 123
John
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.