Я пытаюсь взять эту функцию из PHP в MySQL:
function distancia($p1LA, $p1LO, $p2LA, $p2LO) {
$r = 6371.0;
$p1LA = $p1LA * pi() / 180.0;
$p1LO = $p1LO * pi() / 180.0;
$p2LA = $p2LA * pi() / 180.0;
$p2LO = $p2LO * pi() / 180.0;
$dLat = $p2LA - $p1LA;
$dLong = $p2LO - $p1LO;
$a = sin($dLat / 2) * sin($dLat / 2) + cos($p1LA) * cos($p2LA) * sin($dLong / 2) * sin($dLong / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
return round($r * $c * 1000);
}
И на MySQL я делаю это:
DELIMITER |
CREATE FUNCTION Distancia (la1 DECIMAL, lo1 DECIMAL, la2 DECIMAL, lo2 DECIMAL)
RETURNS DECIMAL
DETERMINISTIC
BEGIN
DECLARE r DECIMAL;
DECLARE la1aux DECIMAL;
DECLARE lo1aux DECIMAL;
DECLARE la2aux DECIMAL;
DECLARE lo2aux DECIMAL;
DECLARE retorno DECIMAL;
DECLARE dLat DECIMAL;
DECLARE dLong DECIMAL;
DECLARE a DECIMAL;
DECLARE c DECIMAL;
SET r = 6371.0;
SET la1aux = la1 * pi()/180.0;
SET lo1aux = lo1 * pi()/180.0;
SET la2aux = la2 * pi()/180.0;
SET lo2aux = lo2 * pi()/180.0;
SET dLat = la2aux - la1aux;
SET dLong = lo2aux - lo1aux;
SET a = sin(dLat / 2) * sin(dLat / 2) + cos(la1aux) * cos(la2aux) * sin(dLong / 2) * sin(dLong / 2);
SET c = 2 * atan2(sqrt(a), sqrt(1 - a));
SET retorno = round(r * c * 1000);
RETURN retorno;
END|
Я вызываю функцию на MySQL, как это:
select Distancia(-46.61579100, -23.54247250, -46.61354560, -23.54093070)/1000;
Результат должен быть 0,276. Но я получаю 0. Я никогда не работал с процедурой или функцией на MySQL раньше, поэтому я не знаю, чего мне не хватает. Я попытался сделать десятичные переменные десятичными (11,8), и это тоже не сработало.
Кто-нибудь с небольшой помощью?
Когда вы выполняете вычисления с плавающими числами, где вычисления не являются простыми (сложение, умножение) и когда промежуточные итоги превышают границы типа данных (особенно если вы используете десятичное число без масштаба и точности), лучше использовать тип данных с плавающей запятой. В конце вы можете выбрать, сколько десятичных разрядов вы хотите получить в результате.
Других решений пока нет …