Dieser Beitrag ist schon älter. Bitte vergewissern Sie sich, dass die Rahmenbedingungen oder der enthaltene Lösungsvorschlag noch dem aktuellen Stand der Technik entspricht.

SQL 2005 Server - Werden Daten falsch ausgelesen?

Mitglied: mf
Hi zusammen.

Wenn ich im SQL Management Studio des SQL2005-Servers eine Datentabelle abfrage, erhalte ich ein entsprechendes Ergebnis für ein spezielles Feld.

Das Ergebnis ist 500. bzw es wird als 500.0000000000000 ( ganze viele nullen ) angezeigt.

Das Feld ist vom Type "decimal(38,20)".

Wenn ich die Datenbank-Tabelle remote abrufe, in einem PHP-Script, so erhalte ich für einige Datensätze ein Ergebnis von 499.999999999 .. was ja nicht unbedingt 500 entspricht.

Nun ist meine Frage woran das liegen kann. Denn wenn ich mit dem ManagementStudio den Select absetze, scheint ja alles zu klappen.

Ich habe versuche mit "*1" das Problem zu lösen. Dies funktioniert auch soweit, aber wenn ich Felder mit der Anzeige habe/hatte, welche vorher 5000.00000000001 angezeigt haben, werden diese dann auch 4999.99999 (etc) angezeigt.

Hat einer eine Idee, um das Phänomen in den Griff zu bekommen?

Thx
Markus

Content-Key: 101576

Url: https://administrator.de/contentid/101576

Ausgedruckt am: 16.09.2021 um 13:09 Uhr

Mitglied: filippg
filippg 11.11.2008 um 22:49:56 Uhr
Goto Top
Hallo,

man merke: Das Binärformat ist nicht zur Darstellung von Nachkommastellen im Dezimalsystem geeignet ;-) face-wink.
In sofern: benötigst du wirklich diesen Datentyp? Manchmal kann man sich auch behelfen, indem man Wert*1000 (o.ä.) speichert, d.h. den Wert auf Ganzzahlen normiert.

Gruß

Filipp
Mitglied: mf
mf 11.11.2008 um 23:07:32 Uhr
Goto Top
Hi Filipp.

Leider habe ich keinen Einfluss auf das Design der Datenbank. Dies ist ein gekauftes Produkt, welches aktuell auch unter dem Dach von Microsoft befindet.

Ich versuche lediglich Daten auszulesen, habe dafür extra einen ReadOnly-SQL-Account angelegt. Allerdings habe ich o.g. Problem.

Nachkommastellen benötige ich aber auf jeden Fall.

Der bisherige Trick "*1" klappt scheinbar nicht überall. Was die Ursache dafür ist, weiss ich nicht.

Ich versuche mal *1000/1000. Mal sehen, ob's was bringt.

Gruss
Markus
Mitglied: Netzheimer
Netzheimer 12.11.2008 um 07:33:13 Uhr
Goto Top
Das Problem bei decimal (auch numeric) ist, dass beim Berechnen Gesamtstellen (bei dir 38) und Nachkommastellen alleine (20) Berücksichtigt werden. In diesem Fall wären maximal 18 Stellen vor dem Komma und 20 Stellen danach. Das wird auch bei Berechnungen so berücksichtigt.

Kannst du sagen, warum du so eine Genauigkeit brauchst oder wäre auch float möglich?
Mitglied: mf
mf 12.11.2008 um 13:15:00 Uhr
Goto Top
"ich" brauche die Anzahl der Nachkommastellen nicht. Die Benutzer würden evtl mit vier Nachkommastellen auskommen.

Aber ... das System ist unantastbar. ;-) face-wink

D.h. ich muss einen Weg finden, der mit dieser obstrusen Beschaffenheit der Datenbank klar kommt.

Wenn du schreibst, dass nur gewissen Stellen in die Berechnung einfliesen .. Ist es möglich auch nur geziehlte eine bestimmte Anzahl an Stellen anzufragen?

ála .. SELECT nachkommas(Spaltenname,4) FROM tabelle

Wenn es eine Funktion gibt, die sowas machen kann, wäre das evtl schon eine Lösung. Bin leider in MSSql nicht so fit.

Thx
Markus
Mitglied: Biber
Biber 12.11.2008 um 13:40:00 Uhr
Goto Top
Moin mf,

du kannst in diesem Fall vermutlich nur durch Probieren dem Ziel näher kommen.
Der M$-Server stellt vermeintlich "vergleichbare" Funktionen unter SSIS/TransAct-SQL bereit, die allerdings mal "runden", mal abschneiden..

In Frage kommen zum einen CAST/CONVERT-Funktionen, zum anderen die ROUND()-Funktion, nach der Du gefragt hast.

Zum Ziel führen sollte am ehesten

Wobei zu prüfen bleibt, ob das Ergebnis identisch ist, wenn Du
  • mit der ROUND()-Funktion einen passenden View zusammentrümmerst (also die Logik im View hinterlegst)
  • die Round()-Funktion innerhalb eines dynamisch erzeugten Statements verwendest.

Laut MSDN ist das Ergebnis von Round() zwar immer -je nach Sichtweise- "richtig", aber eben unterschiedlich.
Redmonder Logik halt...

Grüße
Biber
Mitglied: mf
mf 12.11.2008 um 14:00:26 Uhr
Goto Top
Danke für deine Unterstützung.

Beide Vorschläge bzgl ROUND() funktionieren leider nicht.

ROUND(..., 4) liefert das gleiche "falsche" Ergebnis, mit mehr als 4 Nachkommastellen.
1* ROUND(..., 4) liefert das gleiche Ergebnis, als wenn ich auch nur " *1 " anfüge.

CAST/CONVERT hattest du noch angesprochen. Könntest Du hier noch ein kleines Beispiel posten?

"Netzheimer (Daniel)" schreibt, dass "float" evtl auch ausreichen könnte.

Wie kann ich die Spalte mit CAST/CONVERT umformen?

Thx
Markus

ps. Ich verwende keine Views ... (die Datenbank ist unantastbar. ;-) face-wink)
Mitglied: mf
mf 12.11.2008 um 14:15:32 Uhr
Goto Top
Hi Biber

Danke für den Denkanstoß CAST/CONVERT.

Mit unser aller Freund goo.... konnte ich eine Lösung finden.

CONVERT(decimal(38,10), spaltenmame) alias

Damit werden die amüsanten Daten nun korrigiert anzeigt, ohne eine Änderung an der Datenbank.

Thx
Markus
Mitglied: Biber
Biber 12.11.2008 um 14:18:15 Uhr
Goto Top
Moin mf,

hmm, das "falsche ROUND()-Ergebnis mit mehr als 4 NK-Stellen" verstehe ich nicht...
Kannst Du mal Test-Query und Output posten bitte?

Beispiel zu CAST:


Grüße
Biber
[Edit] Uuups, das war über Kreuz....
kannst Du trotzdem bitte noch das falsche Round()--Ergebnis posten... rein interessehalber?
[/Edit]
Mitglied: mf
mf 12.11.2008 um 16:21:05 Uhr
Goto Top
kannst Du trotzdem bitte noch das falsche Round()--Ergebnis posten... rein interessehalber?

Der Query ist wie bisher geblieben .. halt um das ROUND() ergänzt, aus Deinem Post.

Das Ergebnis war wie im ersten Post gewesen. Also 499.9999 (ganz viele 9er)

Einen Screen aus dem ManagementStudio könnte ich dir zwar posten, aber dort ist es ja erstaunlicherweise korrekt in der Anzeige.

Gruss
Markus
Heiß diskutierte Beiträge
question
235 Prozent gelöscht! Panik!erikroVor 1 TagFrageHumor (lol)9 Kommentare

Moin, der Moment, in dem das Herz stehen bleibt, wenn man auf dem Server ein altes Profil löscht und diese Anzeige sieht: NEIN! HÖR AUF! ...

info
Israelische Sicherheitsfirma kauft im großen Stil VPN-AnbieterLochkartenstanzerVor 1 TagInformationErkennung und -Abwehr15 Kommentare

Moin, Weil viel hier meinen, sie nutzen einen VPN-Anbieter im Ausland, um sich vor den "Behörden" zu verstecken. Die israelische Sicherheitsfirma Kape Securities kauf im ...

question
CIS Härtung Server 2019BloodyRulzVor 1 TagFrageWindows Server9 Kommentare

Hallo zusammen, wie fange ich an?! So viele Fragen. Wir haben verschiedene WinServer2019 Maschinen. Diese sind alle stand-alone. Der Auftrag von unserem Kunden lautet, diese ...

question
Netzwerkstruktur für ein Unternehmen errichtennasir21Vor 1 TagFrageNetzwerke17 Kommentare

Hallo liebes Forum :) Ich habe eine Ausbildung zum Fachinformatiker für Systemintegration gestartet und nun auch meine erste, kleine Projektaufgabe erhalten. Die Aufgabenstellung lautet wie ...

question
Welcher Harddisk Typ und welches Raid in ServerMazenauerVor 1 TagFrageServer-Hardware21 Kommentare

Grüezi zusammen Was würdet ihr - stand heute und jetzt - für einen Raid Typ erstellen und mit was für Disks? Wünschenswert wäre Ausfallsicherheit von ...

question
Drucker Gäste WLANmarkaurelVor 19 StundenFrageLAN, WAN, Wireless20 Kommentare

Hallo zusammen und bitte um eure Hilfe! Ich hab in einer kleinen Schule ein LAN aufgebaut. Mit der Zeit kam natürlich auch der Bedarf an ...

question
Virtualisierungsprojekt für die FacharbeitVentimonusVor 16 StundenFrageVirtualisierung14 Kommentare

Heyho, Ich habe mal ein paar fragen, bezüglich meines Abschlussprojektes, ob das alles überhaupt so Sinnig ist wie ich es mir denke. Kurz zur Erläuterung: ...

general
Backup "to go" für Laptops - wie macht ihr das? gelöst GrinskeksVor 1 TagAllgemeinBackup11 Kommentare

Hallo zusammen, ich frage mich gerade wie ihr das Thema Laptop und Backup angeht. Bei uns sollen nun einige Laptops angeschafft werden und ich tendiere ...