Я работаю над определением расстояния с помощью функции SQL, но получаю следующую ошибку

Произошла недопустимая операция с плавающей запятой.

Вот моя функция

CREATE FUNCTION [dbo].[MeasureDistance] 
(
    -- Add the parameters for the function here
    @lat1 as float,
    @long1 as float,
    @lat2 as float,
    @long2 as float
)
RETURNS float
AS
BEGIN
    -- Declare the return variable here
declare @DegToRad as float
declare @Ans as float
declare @Miles as float

set @DegToRad = 57.29577951
set @Ans = 0
set @Miles = 0

if @lat1 is null or @lat1 = 0 or @long1 is null or @long1 = 0 or @lat2 is
null or @lat2 = 0 or @long2 is null or @long2 = 0
begin
return @Miles 
end
set @Ans = SIN(@lat1 / @DegToRad) * SIN(@lat2 / @DegToRad) + COS(@lat1 / @DegToRad ) * COS( @lat2 / @DegToRad ) * COS(ABS(@long2 - @long1 )/@DegToRad)
set @Miles = 3959 * ATAN(SQRT(1 - SQUARE(@Ans)) / @Ans)
set @Miles = CEILING(@Miles) * 1.609344
return @Miles
END

Когда я отправляю 25.2048,55.2708 Lat и Long, я получаю следующую ошибку.

0
Shamshad Jamal 26 Сен 2018 в 09:18

2 ответа

Лучший ответ

Используйте real вместо float

CREATE FUNCTION [dbo].[MeasureDistance] 
(
    -- Add the parameters for the function here
    @lat1 as real,
    @long1 as real,
    @lat2 as real,
    @long2 as real
)
RETURNS real
AS
BEGIN
    -- Declare the return variable here
declare @DegToRad as real
declare @Ans as real
declare @Miles as real

set @DegToRad = 57.29577951
set @Ans = 0
set @Miles = 0

if @lat1 is null or @lat1 = 0 or @long1 is null or @long1 = 0 or @lat2 is
null or @lat2 = 0 or @long2 is null or @long2 = 0
begin
return @Miles 
end
set @Ans = SIN(@lat1 / @DegToRad) * SIN(@lat2 / @DegToRad) + COS(@lat1 / @DegToRad ) * COS( @lat2 / @DegToRad ) * COS(ABS(@long2 - @long1 )/@DegToRad)
set @Miles = 3959 * ATAN(SQRT(1 - SQUARE(@Ans)) / @Ans)
set @Miles = CEILING(@Miles) * 1.609344
return @Miles
END
3
Zaynul Abadin Tuhin 26 Сен 2018 в 06:22

Избегайте использования типа данных float, вы можете использовать числовые, деньги, но следует полностью избегать float из-за проблемы округления. Типы данных Real, float и double в SQL представляют собой приблизительные числовые значения. В вашем случае вы должны использовать числовой

0
Sonja 26 Сен 2018 в 06:31