2017-01-13 5 views
4

this discussion을 기반으로하는 두 좌표 간 거리에 대한 몇 가지 계산과 함께 기본 쿼리가 있습니다. 독립 실행 형 쿼리로 실행하는 것처럼 보이지만 저장 함수로 실행하려고하면 이상한 결과 (일반적으로 null 또는 99.9999 ...)가 반환됩니다.MySQL이 함수를 저장하지 못했지만 독립 실행 형 쿼리로 작동

독립 쿼리는 다음과 같습니다

SELECT lat, lng, 

    (6371 * acos(cos(radians(32.113277)) * cos(radians(lat)) 
    * cos(radians(lng) - radians(34.799259)) + sin(radians(32.113277)) 
    * sin(radians(lat)))) AS distance_km, 

    (6371000 * acos(cos(radians(32.113277)) * cos(radians(lat)) 
    * cos(radians(lng) - radians(34.799259)) + sin(radians(32.113277)) 
    * sin(radians(lat)))) AS distance_meters 

FROM (
    SELECT 32.113391 as lat , 34.801571 as lng 
) a 

이 ^이 잘 실행됩니다. I 심지어 위해 (모든 입력 값 으려고

select distance_meters(32.113277, 34.799259, 32.113391, 34.801571) 

99.999999 결과

:

create function distance_meters(lat1 decimal(8,6), lng1 decimal(8,6), lat2 decimal(8,6), lng2 decimal(8,6)) 
returns decimal(8,6) DETERMINISTIC 
    return (6371000 * acos(cos(radians(lat1)) * cos(radians(lat2)) 
    * cos(radians(lng2) - radians(lng1)) + sin(radians(lat2)) 
    * sin(radians(lat2)))) 

이처럼 실행 : 다음 저장 기능으로 변경하려고 좌표)를 다음과 같이 저장 함수의 코드의 일부로 나타냅니다.

create function distance_meters() 
returns decimal(8,6) DETERMINISTIC 
     return (6371000 * acos(cos(radians(32.113277)) * cos(radians(32.113391)) 
    * cos(radians(34.801571) - radians(34.799259)) + sin(radians(32.113277)) 
    * sin(radians(32.113391)))); 

전혀 문제가되는 결과!

추신 : 물론 나는 그것을 다시 만들기 전에 매번 함수를 삭제했습니다. 또한 반환 형식을 십진수에서 숫자로 변경하려고했습니다.

편집 :

DELIMITER $ 
create function distance_meters() 
returns decimal(8,6) DETERMINISTIC 
begin 
declare var_name decimal(8,6); 
set var_name = (6371000 * acos(cos(radians(32.113277)) * cos(radians(32.113391)) 
    * cos(radians(34.801571) - radians(34.799259)) + sin(radians(32.113277)) 
    * sin(radians(32.113391)))); 
    return var_name; 
end$ 
DELIMITER ; 
select distance_meters() 

내가 여기서 무엇을 놓치고 : 코멘트에 제안, 나는이 시도했다?

+0

어둠 속에서 촬영되었지만 BEGIN END 섹션을 사용하여 10 진수 변수를 선언하고 쿼리 결과에 SET하고 반환하십시오. 변경 사항이 있습니까? – Mihai

+0

@ 미하이 감사합니다,하지만 불행히도 도움이되지 않았습니다 - 질문의 업데이트 된 (아래 부분) 버전을 참조하십시오. –

+1

십진수 정밀도를 높이면 어떻게됩니까? 너 (18,6) 시도해 주시겠습니까? –

답변

1

해결 방법에는 두 부분이있는 것 같습니다. 한 부분은 함수에서 오타였으며 lat1과 lat2가 전환되었습니다.

리턴 (6,371,000 * ACOS (COS (라디안 (LAT1)) * COS (라디안 (LAT2 )) * COS (라디안 (lng2) - 라디안 (lng1)) + 죄 (라디안 (LAT1)) * sin (라디안 (lat2)))));

다른 비트는 십진수 열의 정밀도를 충분히 증가 시켰습니다. 나는 최소한의 정밀도가 필요한 것을보기 위해 테스트하지 않았지만 DECIMAL (18,6)을 시도했을 때 작동하는 것처럼 보였다.

+0

네 말이 맞아, 나는 아마도 그 분야를 혼란 시켰을거야! 하지만 그건 해결되지 않습니다 - 당신의 버전은 여전히 ​​같은 잘못된 대답을 반환합니다. 문제는 내가 원래 질문에서 말했듯이 하드 코딩 된 값으로 실행 한 경우에도 저장 함수 일 때와 간단한 쿼리 일 때 여전히 다른 결과를 반환합니다. –

+0

편집 후 주석 : (9,6)이 특정 경우에 충분했지만 지금은 요점이 있습니다 :) 감사합니다! –