2014-02-12 21 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