Benutzer mit den meisten Antworten
Convert float to varchar

Frage
-
Hallo zusammen,
zum ersten mal in meinen Projekten habe ich es mit dem float-Datentyp zu tun.
Declare @Lat float
Set @Lat = 13.437669728454
SELECT STR(@Lat), cast(@Lat as varchar(max)) ergeben13 und 13.4377
Frage: Wie kann man das Ergebnis '13.437669728454' erreichen, so daß auch das Runden auf die 4. Stelle hinter dem Komma entfällt?
Grüße
Timo
- Bearbeitet Timo13 Sonntag, 30. März 2014 16:00
Antworten
-
Also zunächst fällt einem hier das varchar(MAX) ins Auge - es ist bestimmt nicht nötig, mehr als 8000 Zeichen speichern zu können. In diesem Beispiel zähle ich 14.
Dazu sollte einem bewusst sein, das float per Definition ungenau ist, und das ob 12 oder 16 Nachkommatellen eigentlich überhaupt nichts aussagt. Über das Datenschema und den Hintergrund kann ich aber natürlich nichts sagen, darum einfach zur Technik:
Declare @Lat float Set @Lat = 13.437669728454 SELECT STR(@Lat), convert(char(22), @Lat, 2) --> scientific notation --> einfach nach Xter Stelle abgeschnitten: SELECT STR(@Lat), convert(char(22), CAST(@Lat AS decimal(14,12)), 2)
Bleibt die Frage, wozu überhaupt eine (ungenaue) Zahl in String konvertiert werden soll - in der Regel ist man mit Zahlen besser bedient, sie als solche zu belassen.
Die Konvertierungs-Optionen sind hier erklärt: http://msdn.microsoft.com/en-us/library/ms187928(v=sql.120).aspx
Alternativ kann man sicher auch ROUND() verwenden.
Andreas Wolter (Blog | Twitter)
MCM - Microsoft Certified Master SQL Server 2008
MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
www.andreas-wolter.com | www.SarpedonQualityLab.com- Als Antwort markiert Timo13 Dienstag, 1. April 2014 08:09
Alle Antworten
-
Also zunächst fällt einem hier das varchar(MAX) ins Auge - es ist bestimmt nicht nötig, mehr als 8000 Zeichen speichern zu können. In diesem Beispiel zähle ich 14.
Dazu sollte einem bewusst sein, das float per Definition ungenau ist, und das ob 12 oder 16 Nachkommatellen eigentlich überhaupt nichts aussagt. Über das Datenschema und den Hintergrund kann ich aber natürlich nichts sagen, darum einfach zur Technik:
Declare @Lat float Set @Lat = 13.437669728454 SELECT STR(@Lat), convert(char(22), @Lat, 2) --> scientific notation --> einfach nach Xter Stelle abgeschnitten: SELECT STR(@Lat), convert(char(22), CAST(@Lat AS decimal(14,12)), 2)
Bleibt die Frage, wozu überhaupt eine (ungenaue) Zahl in String konvertiert werden soll - in der Regel ist man mit Zahlen besser bedient, sie als solche zu belassen.
Die Konvertierungs-Optionen sind hier erklärt: http://msdn.microsoft.com/en-us/library/ms187928(v=sql.120).aspx
Alternativ kann man sicher auch ROUND() verwenden.
Andreas Wolter (Blog | Twitter)
MCM - Microsoft Certified Master SQL Server 2008
MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
www.andreas-wolter.com | www.SarpedonQualityLab.com- Als Antwort markiert Timo13 Dienstag, 1. April 2014 08:09
-
Hallo Andreas,
Hier die Antwort auf Deine Frage:
1. muß ich für Testzwecke die Daten in ein Skript einbauen.
2. Meine Anfrage zum Thema Punkt in Polygon wurde nicht entgültig beantwortet,
so daß ich bei nichtvaliden Objekten über MakeVaild() vielleicht ein valides Objekt bekomme,
jedoch die Funktion STIntersects das Ergebnis 0 bringt, obwohl ich im Zentrum des Polygons meinen Punkt habe.
Da ich mit meiner Arbeit fertig werden muß und weitere Spatialfunktionen auch in Zukunft nicht erforderlich sein werden, habe ich eine eigene Funktionaliät mit einem datenbanktechnischem Ansatz entwickelt, die zwar langsamer ist, jedoch entscheidende Vorteile hat.
- a. man muss die Objekte nicht auf Validität abprüfen.
- b. man hat immer ein Ergebnis, welches garantiert auch zutrifft.
- c. selbst mit ACCESS kann man diese Funktionalität haben
Voraussetzung ist gedoch, daß die Eckpunkte hinter dem Komma um mindestens eine Position länger sein müssen als die Werte der Punkte, die zugeordnet werden. Und um die Länge auszuwerten brauch ich eben die Konvertierung in den String.
Du hat mir sehr geholfen.
Vielen Dank für Deine Antwort.
Timo