2012-07-09 12 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)로 정의된다. 쿼리를 실행할 때 데이터를 다시 가져 오기 시작하고 특정 데이터 행에 오류가 발생합니다. 어떤 통찰력 사전에 너무 많은

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

덕분에 당신이 도움을 줄 수 있습니다 : 예를 들어, 다음 행은 위에서 언급 한 ACOS 함수가 호출 한 번만 예외가 발생합니다!

+0

'지리'유형을 사용하지 않는 이유가 있습니까? – AakashM

답변

9

당신이있는 거 계산 (ACOS에 전달) 계산 된 값이 ROUND 전화로 포장 약간 1보다 한번에 것을 의미 몇 가지 작은 오류, 축적되어

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. 표현식을 3 중화하는 것이 싫다면 cte 또는 파생 테이블에서 [trig_expression]을 래핑하거나 함수를 작성해보십시오. – shawnt00

+0

둘 다 감사합니다! –

관련 문제