Laden...

Sqlproblem bei Datenspaltenvergleich mit float-Werten

Erstellt von oehrle vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.654 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 4 Jahren
Sqlproblem bei Datenspaltenvergleich mit float-Werten

verwendetes Datenbanksystem: <SqlServer 2008>
Hallo, ich habe folgendes Problem beim finden von Datensätzen, die in bestimmten Vorgabetoleranzen liegen.
Es gibt Werte (in der Datentabelle als float typisiert), die wurden zuvor berechnet und in die Datentabelle eingetragen.
Nun kommen täglich neue Daten, die müssen mit den vorhandenen Daten abgeglichen und zugeordnet werden.
Dazu habe ich mit eine Abfrage zusammengebaut, und setze diese (filtere) mit ADO-Net direkt an der Tabelle. Und dabei ist mir das aufgefallen, dass die Auswertung eingentlich passen sollte.

ABER: Bei der 3. "AND"-Verknüpfung scheiden sich die Geister. Die Bedingung sollte meiner Meinung nach passen, da die der Wert der Toleranzgrenze genau identisch mit dem verglichenen Wert sein soll.

Ich habe die beiden letzten Toleranzwerte der Abfrage deshalb auch mal bewusst berechnet ausgegeben, und die 3. "AND"-Verknüpfung mal ausgeblendet (damit auch ein Datensatz gefunden wird).

Hier mal die Abfrage wie sie sein sollte:


SELECT [SapMaterial]
      ,[FlankenwinkelStirnseitig]
      ,[FlankenwinkelSchaftseitig]
      ,[FlankenwinkelStirnseitigMittelwert]
      ,[FlankenwinkelSchaftseitigMittelwert]
      ,[KernbreiteMin]
      ,[KernbreiteMax]
      ,[Gewindeprofilnummer]
      ,[KernradiusMax]
      ,[KernradiusMin]
      ,[KopfradiusMax]
      ,[KopfradiusMin]
	  ,(FlankenwinkelSchaftseitigMittelwert - 0.15) As FlankenwinkelSchaftseitigMittelwertMinTol
	    ,(FlankenwinkelSchaftseitigMittelwert + 0.15) As FlankenwinkelSchaftseitigMittelwertMaxTol
      


  FROM [dbo].[GewindeprofileGewindefraeser_Test]
   WHERE KernbreiteMin  >= 0.794 AND KernbreiteMin <= 0.799000029563904 
   AND (FlankenwinkelStirnseitigMittelwert - 0.15)  <= 30.89467 
   AND  (FlankenwinkelStirnseitigMittelwert + 0.15) >= 30.89467 
   AND (FlankenwinkelSchaftseitigMittelwert - 0.15) <= 29.72001 
   AND (FlankenwinkelSchaftseitigMittelwert + 0.15) >= 29.72001

Wenn ich nun die 3. "AND"-Verknüpfung deaktiviere, dann läuft das durch und der vorhandene Datensatz der zutreffen soll wird gefunden:


SELECT [SapMaterial]
      ,[FlankenwinkelStirnseitig]
      ,[FlankenwinkelSchaftseitig]
      ,[FlankenwinkelStirnseitigMittelwert]
      ,[FlankenwinkelSchaftseitigMittelwert]
      ,[KernbreiteMin]
      ,[KernbreiteMax]
      ,[Gewindeprofilnummer]
      ,[KernradiusMax]
      ,[KernradiusMin]
      ,[KopfradiusMax]
      ,[KopfradiusMin]
	  ,(FlankenwinkelSchaftseitigMittelwert - 0.15) As FlankenwinkelSchaftseitigMittelwertMinTol
	    ,(FlankenwinkelSchaftseitigMittelwert + 0.15) As FlankenwinkelSchaftseitigMittelwertMaxTol
      


  FROM [dbo].[GewindeprofileGewindefraeser_Test]
   WHERE KernbreiteMin  >= 0.794 AND KernbreiteMin <= 0.799000029563904 
   AND (FlankenwinkelStirnseitigMittelwert - 0.15)  <= 30.89467 
   AND  (FlankenwinkelStirnseitigMittelwert + 0.15) >= 30.89467 
   --AND (FlankenwinkelSchaftseitigMittelwert - 0.15) <= 29.72001 
   AND (FlankenwinkelSchaftseitigMittelwert + 0.15) >= 29.72001

Also irgendwie verstehe ich das nicht. Besteht da intern ein Genauigkeitsproblem vom SqlServer mit float wenn er die Daten aus der Tabelle holt?

Was mit dabei aufgfallen ist:

  • Caste ich die Werte in "real" oder "float", oder
  • addiere ich +0.00001 auf den 3. "AND"-Vergleich 29,72001 + 0.00001

dann wird der Datensatz gefunden.

Hat jemand eine Idee an was das genau liegt oder worauf man dabei achten soll?

T
461 Beiträge seit 2013
vor 4 Jahren

Hallo,

vielleicht hilft dir das weiter: https://forums.asp.net/t/1115822.aspx

Hat ein ähnliches Problem mit dem float Datentyp in SQL.

Zudem hier in der Doku

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

W
955 Beiträge seit 2010
vor 4 Jahren

Warum nimmst du nicht den numeric data type?

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 4 Jahren

Hallo Witte, hast recht. Habe gerade mal noch damit rumgespielt. Mit Numeric(18,4) habe ich 4 Nachkommastellen. Übergebe ich einen Wert mit 5 Nachkommastellen, dann wird die 4. Nachkommastelle gerundet.

Ich denke das passt dann so.

Werde die Datenstruktr ändern und die Daten neu generieren lassen.

T
461 Beiträge seit 2013
vor 4 Jahren

Ok, um es noch abzurunden: decimal vs numeric

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

6.911 Beiträge seit 2009
vor 4 Jahren

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"