none
Convert float to varchar RRS feed

  • 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))    ergeben

                      13            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
    Sonntag, 30. März 2014 15:50

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
    Sonntag, 30. März 2014 17:10

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
    Sonntag, 30. März 2014 17:10
  • 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
    Montag, 31. März 2014 07:52