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?

War es hilfreich?

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

LiveDemo

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top