Wie kann ich die Anzahl Nachkommastellen in der SQL?
Ich habe eine Spalte X, die ist voll von Schwimmern mit decimals stellen im Bereich von 0 (keine Dezimalstellen) bis 6 (maximum). Ich kann zählen auf die Tatsache, dass es keine Schwimmer, die mehr als 6 Dezimalstellen. Da, wie mache ich eine neue Spalte, so dass es mir zeigt, wie viele Ziffern kommen nach dem Komma?
Ich gesehen habe, einige threads, die darauf hindeutet, dass ich die CAST konvertieren von float in einen string und dann Parsen der Zeichenfolge zu zählen, die Länge der Zeichenfolge, die kommt nach dem Komma. Ist dies der beste Weg zu gehen?
- beobachten Sie Ihre tagging. Einfach wiederhergestellt
float
, die ich verbrachte die letzten 48 Stunden nukiung ... wieder. :p - Sorry Charles... halten zwei offenen Augen das nächste mal! 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie so etwas wie dieses:
Diese zurück
7
.Habe ich versucht, die obige Abfrage funktioniert mit einem
float
Spalte, aber konnte es nicht so funktioniert wie erwartet. Es funktioniert nur mit einemsql_variant
Spalte, wie Sie hier sehen können: http://sqlfiddle.com/#!6/5c62c/2So, ich ging zu einen anderen Weg finden und darauf aufbauend Antwort, ich habe diese:
Hier ist ein SQL Fiddle, dieses heraus zu testen: http://sqlfiddle.com/#!6/23d4f/29
Konto für die, die wenig Eigenart, hier ist eine modifizierte version behandelt den Fall, wenn der float-Wert keine Nachkommastellen:
Hier ist der dazugehörige SQL Fiddle: http://sqlfiddle.com/#!6/10d54/11
Scale
, nichtPrecision
.Scale
.set
festgelegt wird der Typ variant in einen numerischen mit 7 Dezimalstellen (dh mindestens erforderlich, um den Wert zu speichern), undScale
wird wieder die Präzision, mit der die Datentyp, nicht der Wert. Wenn Sie eine Tabelle-Spalte ist, erhalten Sie den Maßstab der Spalte type, der nicht das Ausmaß der tatsächlichen Anzahl.float
Spalte, sondern für das Leben von mir, ich konnte nicht. Nur ein weiterer Weg, um dorthin zu gelangen.convert(...128)
, obwohl MSDN nicht sagen ", Enthalten für legacy-Gründen und vielleicht in einer zukünftigen Version veraltet."bigint
erhalten Sie, 5432. Dann verwenden Sie LEN zu zählen, die Länge auf diesen Wert = 4.As Decimals
ist nur ein name, den ich gab, um die Spalte. Sie hätte nur LEN und die Spaltennamen werden automatisch generiert, die von SQL Server.bigint
auf einen string, so dass die LEN-Funktion msdn.microsoft.com/en-us/library/ms190329.aspx arbeiten können. 🙂float
?Float symbolisiert nur eine reelle Zahl. Es gibt keine Bedeutung für die Anzahl der Nachkommastellen einer reellen Zahl. Insbesondere die real-Zahl 3 kann mit sechs Dezimalstellen, 3.000000, es ist nur, dass alle Dezimalstellen null sind.
Haben Sie möglicherweise eine Anzeige Bekehrung, die zeigt nicht das Recht die meisten null-Werte in dezimal.
Beachten Sie auch, dass der Grund, es gibt ein maximum von 6 Dezimalstellen wird, dass die siebte ist zu ungenau, so dass der Bildschirm Konvertierung wird nicht zu Begehen, um eine siebte Dezimalstelle Wert.
Beachten Sie auch, dass die Schwimmer sind gespeichert in Binär, und Sie haben tatsächlich binäre stellen rechts vom binären Punkt. Die dezimale Darstellung ist eine Annäherung der binären rational-float-storage das ist wiederum eine Annäherung an eine reelle Zahl.
Also der Punkt ist, es gibt wirklich keine Vorstellung davon, wie viele Dezimalstellen float-Wert hat. Wenn Sie die Konvertierung zu einem string (z.B. mithilfe der CAST -) Sie könnten, zählen die Nachkommastellen. Das wäre wirklich der beste Ansatz für das, was Sie zu tun versuchen.
Dieser thread ist auch mit GUSS, aber ich fand die Antwort interessant:
http://www.sqlservercentral.com/Forums/Topic314390-8-1.aspx
und in ORACLE:
Antwortete ich, dies vor, aber ich kann sagen, aus den Kommentaren, dass es ist ein wenig unklar. Im Laufe der Zeit fand ich einen besseren Weg, um dies auszudrücken.
Berücksichtigen pi als
Dies zeigt pi als 11 Dezimalstellen. Dies war allerdings gerundet auf 12 stellen nach dem Komma als pi-14-stellig ist
Einem computer oder einer Datenbank speichert Werte in Binär. Für ein single precision float pi gespeichert werden würde als
Dies ist eigentlich aufgerundet auf den nächsten Wert einfacher Genauigkeit speichern kann, so wie wir abgerundet (a). Die nächste niedrigste Zahl einfacher Genauigkeit speichern können, ist
So, wenn Sie versuchen, um die Anzahl der Dezimalstellen, die Sie versuchen zu finden, wie viele Dezimalstellen nach dem alle verbleibenden Nachkommastellen auf null. Jedoch, da die Anzahl möglicherweise müssen gerundet werden, um es zu speichern, es repräsentiert nicht den richtigen Wert.
Zahlen auch vorstellen Rundungsfehler als mathematische Operationen werden durchgeführt, einschließlich der Umwandlung von dezimal zu Binär wenn Sie bei der Eingabe der Zahl, und die Umwandlung von Binär zu dezimal, wenn die Anzeige den Wert.
Können Sie zuverlässig die Anzahl der Dezimalstellen einer Zahl in einer Datenbank hat, weil es angenähert ist, um sich um ihn zu speichern, die in eine begrenzte Menge an Speicher. Der Unterschied zwischen den realen Wert, oder sogar die genaue binären Wert in der Datenbank wird gerundet zu stellen es in dezimal. Es könnte immer mehr Dezimalstellen, die fehlende Rundung, so dass Sie nicht wissen, wenn die Nullen haben würde, nicht mehr nicht-null-Ziffern nach es.
Lösung für Oracle, aber Sie bekommen die Idee. trunc() entfernt die Dezimalstellen in Oracle.
Die Idee mit der Abfrage: es werden alle Dezimalstellen nach Links, nachdem Sie mehrfach durch 1 000 000.
Hier ist ein weiteres Beispiel Oracle. Wie ich immer wieder warnen, nicht-Oracle-Benutzer, bevor Sie anfangen zu Schreien bei mir und downvoting etc... die SUBSTRING und INSTRING sind von ANSI-SQL-standard-Funktionen und kann verwendet werden, in jeder SQL. Die Dual-Tabelle ersetzt werden kann, mit jeder anderen Tabelle oder erstellt werden. Hier ist der link zur SQL SERVER-blog whre ich kopiert dual-Tabelle code aus: http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/
Der Länge nach Punkt oder Dezimalpunkt ist von dieser Abfrage zurückgegeben werden.
Die str umgewandelt werden kann, to_number(str), falls erforderlich. Sie können auch die Länge der Zeichenfolge vor dem dot-decimal place - code zu ändern LENGTH(SUBSTR(str, 1, dot_pos))-1 und entfernen +1 im INSTR Teil:
Haben Sie schon Antworten und Beispiele zu Gießen usw...