2012-07-09 37 views
3

我收到以下錯誤「發生了無效的浮點操作。」當我運行此查詢:計算距離時收到以下錯誤與我的查詢

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 

所有* geoLat和*的geoLong數據定義爲數字(18,10)。當我運行查詢時,我開始獲取數據,然後在特定行數據上出現錯誤。例如,下面的一行只拋出一旦ACOS函數被調用上述異常:

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

預先感謝任何見解這麼多,你可能能夠幫助!

+0

有沒有原因你沒有使用'geography'類型? – AakashM 2012-07-10 07:55:26

回答

9

你計算積累的一些小錯誤,這意味着計算值(傳遞給ACOS)是小幅高於1.嘗試用ROUND調用它包裹:

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

我們在哪裏'只有保留15位小數的精度。

+1

如果沒有捕獲所有錯誤,則可能會更安全:CASE WHEN [trig_expression]> 1 THEN 1 WHEN [trig_expression] <0 THEN 0 ELSE [trig_expression] END。如果你不喜歡重複表達式,你可以嘗試在cte或派生表中包裝[trig_expression],或者寫一個函數。 – shawnt00 2012-07-09 17:26:44

+0

謝謝你們兩位! – 2012-07-10 20:41:59