mysql为什么需要存储函数_为什么这个MySQL存储函数给出的结果与在查...

这是一个关于使用半正公式计算地球上两个纬度和经度点之间距离的问题,用于需要“找到最近”函数的项目.

在this post中,在MySQL中很好地讨论并解决了hasrsine公式.

然后我询问this question将其转换为存储函数,以便它可用于将来的项目,而无需查找,记住或重新键入长形式的公式.

都很好.除了我的函数结果(稍微)不同于直接在查询中键入公式,所有其他条件相同.为什么是这样?

所以这是我写的函数:

DELIMITER $$

DROP FUNCTION IF EXISTS haversine $$

CREATE FUNCTION `haversine`

(fromLatitude FLOAT,

fromLongitude FLOAT,

toLatitude FLOAT,

toLongitude FLOAT,

unit VARCHAR(20)

)

RETURNS FLOAT

DETERMINISTIC

COMMENT 'Returns the distance on the Earth between two known points of longitude and latitude'

BEGIN

DECLARE radius FLOAT;

DECLARE distance FLOAT;

IF unit = 'MILES' THEN SET radius = '3959';

ELSEIF (unit = 'NAUTICAL_MILES' OR unit='NM') THEN SET radius = '3440.27694';

ELSEIF (unit = 'YARDS' OR unit='YD') THEN SET radius = '6967840';

ELSEIF (unit = 'FEET' OR unit='FT') THEN SET radius = '20903520';

ELSEIF (unit = 'KILOMETRES' OR unit='KILOMETERS' OR unit='KM') THEN SET radius = '6371.3929';

ELSEIF (unit = 'METRES' OR UNIT='METERS' OR unit='M') THEN SET radius = '6371392.9';

ELSE SET radius = '3959'; /* default to miles */

END IF;

SET distance = (radius * ACOS(COS(RADIANS(fromLatitude)) * COS(RADIANS(toLatitude)) * COS(RADIANS(toLongitude) - RADIANS(fromLongitude)) + SIN(RADIANS(fromLatitude)) * SIN(RADIANS(toLatitude))));

RETURN distance;

END$$

DELIMITER ;

这里有一组测试查询,用于查找伦敦眼和白金汉宫之间的距离,仅供参考.显然,通常情况下,您可以使用您要与之比较的地理位置“事物”数据库中的字段替换目的地.

SET @milesModifier = 3959;

SET @myLat = 51.503228;

SET @myLong = -0.119703;

SET @destLat = 51.501267;

SET @destLong = -0.142697;

SELECT @kilometerModifier AS radius,

@myLat AS myLat,

@myLong AS myLong,

@destLat AS destLat,

@destLong AS destLong,

(@milesModifier * ACOS(COS(RADIANS(@myLat)) * COS(RADIANS(@destLat)) * COS(RADIANS(@destLong) - RADIANS(@myLong)) + SIN(RADIANS(@myLat)) * SIN(RADIANS(@destLat)))) AS longFormat,

haversine(@myLat,@myLong,@destLat,@destLong,'MILES') AS distanceMiles,

haversine(@myLat,@myLong,@destLat,@destLong,'NAUTICAL_MILES') AS distanceNautical,

haversine(@myLat,@myLong,@destLat,@destLong,'KM') AS distanceKm,

haversine(@myLat,@myLong,@destLat,@destLong,'METRES') AS distanceMetres,

haversine(@myLat,@myLong,@destLat,@destLong,'YARDS') AS distanceYards,

haversine(@myLat,@myLong,@destLat,@destLong,'FEET') AS distanceFeet,

haversine(@myLat,@myLong,@destLat,@destLong,'') AS distanceDefault

在这个例子中,我们使用里程 – 所以我们将半径(测试中的@milesModifier,函数中的半径)设置为3959.

我得到的结果很有趣(在MySQL 5.2.6社区版上),重点是:

| longFormat | distanceMiles |

|------------------|-----------------|

| 0.99826000106148 | 0.9982578754425 |

longFormat是在查询中完成的数学运算,distanceMiles是函数的结果.

结果是不同的…好吧,所以它在项目中使用函数的意义不大,但我很想知道函数内部或外部的相同公式有不同的结果.

我猜它与FLOAT的长度有关 – 它们没有在函数中指定,我已经尝试指定它们(直到30,15)为我拥有的所有数字和输出提供足够的空间我期待 – 但结果仍然略有不同.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值