Sử dụng chức năng này
CREATE FUNCTION dbo.DictanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END
Bạn có thể sắp xếp theo chức năng này, NHƯNG trên các tập dữ liệu lớn, tốc độ sẽ rất chậm, vì vậy hãy cố gắng lọc trước tập bản ghi
CẬP NHẬT:
Sử dụng dữ liệu thử nghiệm của @ chopikadze:
declare @lat float, @lng float
select @lat = 41.0186, @lng = 28.964701
declare @Location table(Latitude float, Longtitude float, Name nvarchar(50))
insert into @Location(Latitude, Longtitude, Name) values (41.0200500000, 40.5234490000, 'a')
insert into @Location(Latitude, Longtitude, Name) values (41.0185714000, 37.0975924000, 'b')
insert into @Location(Latitude, Longtitude, Name) values (41.0184913000, 34.0373739000, 'c')
insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 39.5833333000, 'd')
insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 28.9333333000, 'e')
SELECT ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude)) DistanceKm, * FROM @Location
ORDER BY ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude))
Giả sử rằng Trái đất KHÔNG phải là một geoid, mà là một quả bóng tròn, nếu bạn cần công thức chính xác dưới 1m - Tôi có thể tìm thấy nó, không mang theo nó với tôi