Postgre 출력형태의 문제 0 3 830

by 김선우 [SQL Query] Postgre [2018.01.17 15:59:03]


안녕하세요.

Postgre 개발환경A,B에서의 동일함수 출력형태가 다른 문제에 대해 질문드립니다.

환경A,B모두 PostgreSQL9.4환경입니다.

 

개발환경 A,B에서 다음과 같은 함수를 정의 하였습니다.


CREATE OR REPLACE FUNCTION latlon_to_dist(lat1 float,lon1 float,lat2 float,lon2 float) RETURNS float AS $$
-- 두지점의 거리를 측정(Km)
-- lat1,lon1:1지점의위도,경도
-- lat2,lon2:2지점의위도,경도
DECLARE diffLatitudeRad float;
DECLARE diffLongitudeRad float;
DECLARE r float;
DECLARE diffLatitudeKm float;
DECLARE diffLongitudeKm float;
BEGIN


diffLatitudeRad := (lat1-lat2) * pi()/ 180.0; -- 위도차(RADIAN)
diffLongitudeRad := (lon1-lon2) * pi() / 180.0; -- 경도차(RADIAN)
r := 6378.137; -- 지구의 반경
diffLatitudeKm = diffLatitudeRad * r;
diffLongitudeKm = cos( lon1*pi()/180.0) * r * diffLongitudeRad ; -- 위도방향의 거리(Km)
RETURN sqrt(diffLatitudeKm*diffLatitudeKm + diffLongitudeKm*diffLongitudeKm); -- 두지점의 거리(Km)
END;
$$ LANGUAGE plpgsql;

 

상기 함수를 이용하여 속도(km/h)를 계산하는 SQL을 개발환경A에서 실행하였을 경우의 출력형태입니다.
dbxx=# select ROUND((latlon_to_dist(33.8,132.7,35.5,139.6)/EXTRACT(EPOCH FROM CAST('2017/10/17 10:07:03' AS timestamp) - CAST('2017/10/17 9:59:06' AS timestamp))/1000*60*60)::NUMERIC,1);
 round
--------
 4182.7
(1 row)

 

 

똑같은 select를 개발환경B에서 실행하였을 때의 출력형태 입니다.
dbxx=# select ROUND((latlon_to_dist(33.8,132.7,35.5,139.6)/EXTRACT(EPOCH FROM CAST('2017/10/17 10:07:03' AS timestamp) - CAST('2017/10/17 9:59:06' AS timestamp))/1000*60*60)::NUMERIC,1);
 round
--------
 4.2
(1 row)

 

환경A,B의 출력형태가 달라서 헤매고 있습니다. 원하는 출력형태는 환경A의 출력형태입니다.

환경B에서는  4182.7를 4.1827로 계산해서 4.2로 출력하는게 아닌가 의심하고 있습니다.

 

아시는 분이 계시면 부탁드립니다.

 

 

 

 

 

 

by 주킹 [2018.01.17 16:53:27]

 CREATE OR REPLACE FUNCTION latlon_to_dist(lat1 float,lon1 float,lat2 float,lon2 float) RETURNS float AS $$
-- 두지점의 거리를 측정(Km)
-- lat1,lon1:1지점의위도,경도
-- lat2,lon2:2지점의위도,경도
DECLARE diffLatitudeRad float;
 DECLARE diffLongitudeRad float;
 DECLARE r float;
 DECLARE diffLatitudeKm float;
 DECLARE diffLongitudeKm float;
 BEGIN


 diffLatitudeRad := (lat1-lat2) * pi()/ 180.0; -- 위도차(RADIAN)
 diffLongitudeRad := (lon1-lon2) * pi() / 180.0; -- 경도차(RADIAN)
 raise notice '%',diffLatitudeRad;
 raise notice '%',diffLongitudeRad;
 r := 6378.137; -- 지구의 반경
diffLatitudeKm = diffLatitudeRad * r;
raise notice '%',diffLatitudeKm;
 diffLongitudeKm = cos( lon1*pi()/180.0) * r * diffLongitudeRad ; -- 위도방향의 거리(Km)
 raise notice '%',diffLongitudeKm;
 RETURN sqrt(diffLatitudeKm*diffLatitudeKm + diffLongitudeKm*diffLongitudeKm); -- 두지점의 거리(Km)
 END;
 $$ LANGUAGE plpgsql;

raise notice로 두 서버에서 어떻게 찍는지를 보셔야할듯합니다.

올려주신걸로만 돌리면 B로 결과가 나오네요..

한 가지 생각 나는 것은 동일명으로 INPUT이나 OUTPUT 타입이 다른 형태로 있는 게 있는지 확인바랍니다.


by 김선우 [2018.01.17 19:11:43]

주킹님 답변 감사드립니다.

그런데 저의 착각이었습니다.

어처구니 없게도 환경A와 환경B의 함수정의가 달랐네요. ㅠ.ㅠ

환경A에서 1000을 곱하고 있었다는 ㅠ.ㅠ

소란떨어 죄송했습니다.

 


by 김선우 [2018.01.17 19:16:15]

아참 그리고 거리를 구하는 함수를 다음과 같이 변경했습니다.

이쪽이 더 정확하게 나오네요.

RETURN ROUND((6378.137*acos(cos(radians(lat1))*cos(radians(lat2))*cos(radians(lon2)-radians(lon1)) + sin(radians(lat1))*sin(radians(lat2))))::NUMERIC*1000,0);

감사합니다.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입