안녕하세요.
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로 출력하는게 아닌가 의심하고 있습니다.
아시는 분이 계시면 부탁드립니다.
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 타입이 다른 형태로 있는 게 있는지 확인바랍니다.