有个业务需求是根据传入用户的经纬度获取至商家的距离并且按照距离排序。所以在mysql中写了一个计算距离的函数,然后因为自己失误出现了一个坑。
先上一个有问题的计算距离函数
DELIMITER $$
USE `xyj-base-m1`$$
DROP FUNCTION IF EXISTS `getDistance1`$$
CREATE DEFINER=`root`@`%` FUNCTION `getDistance1`(lat DECIMAL,lon DECIMAL,gasid BIGINT) RETURNS DECIMAL(10,2)
NO SQL
BEGIN
DECLARE distance DECIMAL;
SELECT
ROUND(
6378.137 * 2 * ASIN(
SQRT(
POW(
SIN(
(
lat * PI() / 180 - latitude * PI() / 180
) / 2
),
2
) + COS(lat * PI() / 180) * COS(latitude * PI() / 180) * POW(
SIN(
(
lon * PI() / 180 - longitude * PI() / 180
) / 2
),
2
)
)
) * 1000
)
INTO distance FROM part_gasinfo WHERE id= gasid;
RETURN distance;
END$$
DELIMITER ;
然后是正常的函数
DELIMITER $$
USE `xyj-base-m1`$$
DROP FUNCTION IF EXISTS `getDistance1`$$
CREATE DEFINER=`root`@`%` FUNCTION `getDistance1`(lat DECIMAL(10,7),lon DECIMAL(10,7),gasid BIGINT) RETURNS DECIMAL(10,2)
NO SQL
BEGIN
DECLARE distance DECIMAL;
SELECT
ROUND(
6378.137 * 2 * ASIN(
SQRT(
POW(
SIN(
(
lat * PI() / 180 - latitude * PI() / 180
) / 2
),
2
) + COS(lat * PI() / 180) * COS(latitude * PI() / 180) * POW(
SIN(
(
lon * PI() / 180 - longitude * PI() / 180
) / 2
),
2
)
)
) * 1000
)
INTO distance FROM part_gasinfo WHERE id= gasid;
RETURN distance;
END$$
DELIMITER ;
问题原因,传参精度问题导致!!!!
记录一下,以后避免此问题,同时记录一下mysql计算距离的函数