Dezimalstellen in SQL Server abschneiden (nicht runden).
-
09-06-2019 - |
Frage
Ich versuche herauszufinden, wie man zusätzliche Dezimalstellen in SQL am besten ohne Rundung abschneiden oder weglassen kann.Zum Beispiel:
declare @value decimal(18,2)
set @value = 123.456
Dadurch wird automatisch gerundet @value
zu sein 123.46
, was in den meisten Fällen gut ist.Für dieses Projekt benötige ich das jedoch nicht.Gibt es eine einfache Möglichkeit, die Dezimalstellen, die ich nicht benötige, abzuschneiden?Ich weiß, dass ich das verwenden kann left()
Funktion und konvertieren Sie sie zurück in eine Dezimalzahl.Gibt es noch andere Möglichkeiten?
Lösung
select round(123.456, 2, 1)
Andere Tipps
ROUND ( 123.456 , 2 , 1 )
Wenn der dritte Parameter != 0 es wird eher gekürzt als gerundet
http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Syntax
ROUND (numerischer_Ausdruck, Länge [,Funktion])
Argumente
numerischer_AusdruckIst Ausdruck der exakten numerischen oder ungefähren numerischen Datentypkategorie, mit Ausnahme des Bit -Datentyps.
LängeIst die Genauigkeit, auf die numeric_expression gerundet werden soll.Die 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.
- FunktionDer Typ des auszuführenden Vorgangs.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.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
So konnte ich abschneiden und nicht runden:
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, setzen Sie sie einfach um:
select cast((123.456-(123.456%.001)) as decimal (18,2))
gibt 123,45 zurück
Unabhängig davon, ob der dritte Parameter 0, 1 oder 2 ist, wird Ihr Wert nicht gerundet.
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Round hat einen optionalen Parameter
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
Eine weitere Kürzung 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
Wollen Sie die Dezimalzahl oder nicht?
Wenn nicht, verwenden Sie
select ceiling(@value),floor(@value)
Wenn Sie es mit 0 machen, machen Sie eine Runde:
select round(@value,2)
Dadurch wird der Dezimalteil einer beliebigen Zahl entfernt
SELECT ROUND(@val,0,1)
Ich weiß, das ist ziemlich spät, aber ich sehe darin keine Antwort und verwende diesen Trick schon seit Jahren.
Subtrahieren Sie einfach .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 korrekten Wert angepasst, den Sie suchen.
Übrigens, stellen Sie das Programm aus dem Film „Office Space“ nach?
Versuchen Sie bitte, diesen Code zu verwenden, um 3 Dezimalwerte nach einem Punkt in 2 Dezimalstellen umzuwandeln:
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
Die Ausgabe beträgt 123,46
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)
Ein anderer Weg ist ODBC TRUNCATE
Funktion:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
Ausgabe:
╔═════════╦═════════╗
║ val ║ result ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝
Anmerkung:
Ich empfehle die integrierte Verwendung ROUND
Funktion mit 3. Parameter auf 1 gesetzt.
Ich weiß, dass diese Frage wirklich alt ist, aber niemand hat Teilzeichenfolgen zum Runden verwendet.Dies bietet den Vorteil der Möglichkeit, wirklich lange Zahlen zu runden (die Grenze Ihrer Zeichenfolge in SQL Server beträgt normalerweise 8000 Zeichen):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)
Mod(x,1)
ist meiner Meinung nach der einfachste Weg.