2014-02-12 32 views
3

全部。用於計算Haversine距離的MySQL函數

我想創建一個mysql函數來計算兩個地理代碼之間的半徑距離。

CREATE FUNCTION haversineDistance 
       (
        lat1 VARCHAR(256), 
        long1 VARCHAR(256), 
        lat2 VARCHAR(256), 
        long2 VARCHAR(256) 
       ) 
RETURNS FLOAT DETERMINISTIC 
BEGIN 

     DECLARE radLat1 FLOAT; 
     DECLARE radLong1 FLOAT; 
     DECLARE radLat2 FLOAT; 
     DECLARE radLong2 FLOAT; 
     DECLARE dLat FLOAT; 
     DECLARE dLong FLOAT; 
     DECLARE cordLength FLOAT; 
     DECLARE centralAngle FLOAT; 
     DECLARE distance FLOAT; 

     SET radLat1 = CAST(lat1 AS FLOAT) * PI()/180; 
     SET radLong1 = CAST(long1 AS FLOAT) * PI()/180; 
     SET radLat2 = CAST(lat2 AS FLOAT) * PI()/180; 
     SET radLong2 = CAST(long2 AS FLOAT) * PI()/180; 
     SET dLat = radLat2 - radLat1; 
     SET dLong = radLong2 - radLong2; 
     SET cordLength = POW(SIN(dLat/2),2)+COS(lat1)*COS(lat2)*POW(SIN(dLon/2),2); 
     SET centralAngle = 2 * ATAN2(SQRT(cordLength), SQRT(1-cordLength)); 
     SET distance = 6367 * centralAngle; 

     RETURN distance; 
END 

但是我得到了這樣的錯誤;

1064 - 您的SQL語法錯誤;檢查手冊中 對應於你的MySQL服務器版本正確的語法使用 「」附近4行

任何人有一個想法?

預先感謝您。

+0

如果我們知道第4行是什麼,它將幫助我們幫助您。 –

回答

2

好改回來的分隔符。

解決了它。

DELIMITER $$ 
CREATE FUNCTION haversineDistance 
       (
        lat1 VARCHAR(256), 
        long1 VARCHAR(256), 
        lat2 VARCHAR(256), 
        long2 VARCHAR(256)) 
RETURNS FLOAT DETERMINISTIC 
BEGIN 

     DECLARE radLat1 FLOAT; 
     DECLARE radLong1 FLOAT; 
     DECLARE radLat2 FLOAT; 
     DECLARE radLong2 FLOAT; 
     DECLARE dLat FLOAT; 
     DECLARE dLong FLOAT; 
     DECLARE cordLength FLOAT; 
     DECLARE centralAngle FLOAT; 
     DECLARE distance FLOAT; 

     SET radLat1 = CAST(lat1 AS DECIMAL(10,10)) * PI()/180; 
     SET radLong1 = CAST(long1 AS DECIMAL(10,10)) * PI()/180; 
     SET radLat2 = CAST(lat2 AS DECIMAL(10,10)) * PI()/180; 
     SET radLong2 = CAST(long2 AS DECIMAL(10,10)) * PI()/180; 
     SET dLat = radLat2 - radLat1; 
     SET dLong = radLong2 - radLong2; 
     SET cordLength = POW(SIN(dLat/2),2)+COS(lat1)*COS(lat2)*POW(SIN(dLon/2),2); 
     SET centralAngle = 2 * ATAN2(SQRT(cordLength), SQRT(1-cordLength)); 
     SET distance = 6367 * centralAngle; 

     RETURN distance; 
END 
0

現在,由於分號字符在您的函數中作爲行分隔符存在,您會收到錯誤。

爲了進一步解釋,從MySQL documentation

默認情況下直接引用,MySQL識別分號作爲語句分隔符, 所以你必須重新定義分隔符暫時導致MySQL來傳遞 整個存儲程序定義到服務器。

這意味着您必須爲您的程序編譯臨時覆蓋默認的分隔符。封裝您的程序

DELIMITER $$ 
    your code for function 
$$ 

然後試試看。

編輯: 您可以通過指定默認的分隔符再次

mysql> DELIMITER ; 
+0

謝謝!你的解決方案解決了我的問題 – adeltahir