Ich habe eine Kolumne DECIMAL(9,6)
dh sie unterstützt Werte wie 999.123456.
Aber wenn ich Daten wie 123,4567 einfüge, wird es 123,456700
Wie entferne ich diese Nullen?
sql
tsql
sql-server-2008
formatting
decimal
abatishchev
quelle
quelle
Antworten:
A
decimal(9,6)
speichert 6 Ziffern auf der rechten Seite des Kommas. Ob nachgestellte Nullen angezeigt werden sollen oder nicht, ist eine Formatierungsentscheidung, die normalerweise auf der Clientseite implementiert wird.Aber da SSMS Formate
float
ohne nachfolgende Nullen können Sie Nullen Hinter entfernen , indem Sie das Gießendecimal
auf einfloat
:Drucke:
(Mein Dezimaltrennzeichen ist ein Komma, aber SSMS formatiert die Dezimalstelle mit einem Punkt. Anscheinend ein bekanntes Problem .)
quelle
Sie können die
FORMAT()
Funktion verwenden (SqlAzure und Sql Server 2012+):Seien Sie vorsichtig bei der Verwendung mit FLOAT (oder REAL): Verwenden Sie nicht
g17
oder größer (oderg8
größer mit REAL), da die begrenzte Genauigkeit der Maschinendarstellung unerwünschte Effekte verursacht:Beachten Sie außerdem, dass gemäß der Dokumentation :
Funktioniert auch in SqlAzure.
quelle
quelle
Ich wollte nicht in Float umwandeln, da möglicherweise mehr Ziffern in meiner Dezimalstelle stehen, als Float darstellen kann
FORMAT
Bei Verwendung mit einem Standard-.net-Format gab die Zeichenfolge 'g8' die wissenschaftliche Notation bei sehr kleinen Dezimalstellen (z. B. 1e-08) zurück, was ebenfalls ungeeignet warDurch die Verwendung einer benutzerdefinierten Formatzeichenfolge ( https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings ) konnte ich das erreichen, was ich wollte:
Wenn Sie möchten, dass Ihre Zahl mindestens eine nachgestellte Null hat, damit aus 2.0 nicht 2 wird, verwenden Sie eine Formatzeichenfolge wie
0.0#####
Der Dezimalpunkt ist lokalisiert, sodass Kulturen, die ein Komma als Dezimaltrennzeichen verwenden, auf eine Kommaausgabe stoßen, bei der die. ist
Dies ist natürlich die unangenehme Praxis, die Datenschicht formatieren zu lassen (aber in meinem Fall gibt es keine andere Schicht; der Benutzer führt buchstäblich eine gespeicherte Prozedur aus und schreibt das Ergebnis in eine E-Mail: /)
quelle
Drucke:
quelle
Sollte es tun.
quelle
Versuche dies :
Gibt 20.55
quelle
Ich hatte ein ähnliches Problem, musste aber auch den Dezimalpunkt entfernen, wenn keine Dezimalstelle vorhanden war. Hier ist meine Lösung, die die Dezimalstelle in ihre Komponenten aufteilt und die Anzahl der Zeichen, die aus der Dezimalzeichenfolge entnommen werden, auf der Länge von basiert die Fraktionskomponente (ohne Verwendung von CASE). Um die Sache noch interessanter zu machen, wurde meine Nummer als Float ohne Dezimalstellen gespeichert.
Das Ergebnis ist schmerzhaft, ich weiß, aber ich bin mit viel Hilfe aus den obigen Antworten dort angekommen.
quelle
Der beste Weg ist, vor dem Konvertieren NICHT in FLOAT oder MONEY zu konvertieren, da die Gefahr eines Genauigkeitsverlusts besteht. Die sicheren Wege können also ungefähr so aussehen:
Dabei kann @value eine beliebige Dezimalstelle sein (x, y).
quelle
sp_
für gespeicherte Prozeduren,fn_
für Funktionen,tbl
für Tabellen und so weiter on ... dies ist keine Voraussetzung, aber dies sind bewährte Methoden zum Organisieren unserer Datenbanken.Ich hatte ein ähnliches Problem, musste nachgestellte Nullen von Zahlen wie trimmen
xx0000,x00000,xxx000
Ich benutzte:
Code ist der Name des Feldes mit der zu schneidenden Nummer. Hoffe das hilft jemand anderem.
quelle
Andere Option...
Ich weiß nicht, wie effizient das ist, aber es scheint zu funktionieren und geht nicht über float:
Die mittlere Linie entfernt nachgestellte Leerzeichen, die beiden äußeren entfernen den Punkt, wenn keine Dezimalstellen vorhanden sind
quelle
Ich musste nachfolgende Nullen auf meinen Dezimalstellen entfernen, damit ich eine Zeichenfolge einer bestimmten Länge mit nur führenden Zahlen ausgeben konnte Nullen
(zB musste ich 14 Zeichen ausgeben, damit aus 142.023400 000000142.0234 wurde),
Ich habe verwendet
parsename
,reverse
undcast
as int
um die nachgestellten Nullen zu entfernen:(Um dann meine führenden Nullen zu erhalten, könnte ich die korrekte Anzahl von Nullen basierend auf der Länge der obigen Werte replizieren und diese mit der Vorderseite der obigen verknüpfen.)
Ich hoffe das hilft jemandem.
quelle
Es ist möglich, führende und nachfolgende Nullen in TSQL zu entfernen
Konvertieren Sie es mit der STR TSQL-Funktion in einen String, wenn nicht mit einem String. Dann
Entfernen Sie sowohl führende als auch nachfolgende Nullen
Mehr Infos im Forum .
quelle
REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')
Wie wäre es damit? Angenommen, Daten kommen als @thisData in Ihre Funktion:
quelle
quelle
Ich verstehe, dass dies ein alter Beitrag ist, möchte aber SQL bereitstellen, das ich mir ausgedacht habe
quelle
Versuche dies.
quelle
Am einfachsten ist es, den Wert als FLOAT und dann in einen String-Datentyp umzuwandeln.
quelle
Versuche dies:
quelle
Ich weiß, dass dieser Thread sehr alt ist, aber für diejenigen, die SQL Server 2012 oder höher nicht verwenden oder die FORMAT-Funktion aus irgendeinem Grund nicht verwenden können, funktioniert Folgendes.
Viele der Lösungen funktionierten auch nicht, wenn die Anzahl kleiner als 1 war (z. B. 0,01230000).
Bitte beachten Sie, dass das Folgende nicht mit negativen Zahlen funktioniert.
Gibt 10.012345 bzw. 0.012345 zurück.
quelle
Versuche dies:
quelle
999999
, fordert das OP auf, die nachfolgenden Nullen zu entfernen.Eine DECIMAL (9,6) -Spalte wird ohne Genauigkeitsverlust in float konvertiert, sodass CAST (... AS float) den Trick ausführt.
@HLGEM: zu sagen, dass Float eine schlechte Wahl für die Speicherung von Zahlen ist und "Float niemals verwenden" ist nicht korrekt - Sie müssen nur Ihre Zahlen kennen, z. B. würden Temperaturmessungen als Floats gut funktionieren.
@abatishchev und @japongskie: Präfixe vor gespeicherten SQL-Prozessen und -Funktionen sind immer noch eine gute Idee, wenn sie nicht benötigt werden. Die von Ihnen erwähnten Links weisen nur an, das Präfix "sp_" nicht für gespeicherte Prozeduren zu verwenden, die Sie nicht verwenden sollten. Andere Präfixe sind in Ordnung, z. B. "usp_" oder "spBob_".
Referenz: "Alle Ganzzahlen mit 6 oder weniger signifikanten Dezimalstellen können ohne Genauigkeitsverlust in einen IEEE 754-Gleitkommawert konvertiert werden": https://en.wikipedia.org/wiki/Single-precision_floating-point_format
quelle