3 Stimmen

Erhalte den folgenden Fehler bei meiner Abfrage beim Berechnen der Entfernung.

Ich erhalte den folgenden Fehler "Ein ungültiger Gleitkommaoperation ist aufgetreten.", wenn ich diese Abfrage ausführe:

SELECT PolID, LocID, Address, City, StateCode, OrigGeoLat, OrigGeoLong, NewGeoLat, NewGeoLong, 
acos(sin(radians(OrigGeoLat)) * sin(radians(NewGeoLat)) +
        cos(radians(OrigGeoLat)) * cos(radians(NewGeoLat)) *
        cos(radians(OrigGeoLong - NewGeoLong))) * 6372.8  as Distance
FROM zzGeoDataTMP

All of the *geoLat and *geoLong data is defined as numeric(18,10). When I run the query I start getting data back and then I get errors on specific rows of data. For example the following row throws the above mentioned exception only once the ACOS function is called:

OrigGeoLat|OrigGeoLong|NewGeoLat|NewGeoLong
---------------------------------------------
32.9364620|-80.0411000|32.9364620|-80.0411000

Vielen Dank im Voraus für jeden Einblick, den Sie möglicherweise zur Verfügung stellen können!

0 Stimmen

Gibt es einen Grund, warum Sie den Geografie Typ nicht verwenden?

9voto

Damien_The_Unbeliever Punkte 227101

Ihre Berechnung sammelt einige kleine Fehler an, was bedeutet, dass der berechnete Wert (übergeben an ACOS) leicht höher als 1 ist. Versuchen Sie, ihn mit einem ROUND-Aufruf zu umhüllen:

acos(Runde(sin(radians(OrigGeoLat)) * sin(radians(NewGeoLat)) +
    cos(radians(OrigGeoLat)) * cos(radians(NewGeoLat)) *
    cos(radians(OrigGeoLong - NewGeoLong)),15)
    )

Wo wir nur 15 Dezimalstellen Genauigkeit beibehalten.

1 Stimmen

Wenn das nicht alle Fehler erfasst, könnte dies sicherer sein: CASE WHEN [trig_expression] > 1 THEN 1 WHEN [trig_expression] < 0 THEN 0 ELSE [trig_expression] END. Wenn Ihnen die Verdopplung des Ausdrucks nicht gefällt, könnten Sie versuchen, [trig_expression] in einem cte oder abgeleiteten Tabellenfeld zu umschließen oder sogar eine Funktion zu schreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X