Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

намерете най-близкото местоположение в ms-sql

Използвайте тази функция

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

Можете да поръчате чрез тази функция, НО при големи масиви от данни това ще бъде много бавно, така че опитайте да филтрирате предварително набора от записи

UPD:

Използване на тестовите данни на @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))

Ако приемем, че Земята НЕ е геоид, а кръгла топка, ако имате нужда от под 1 m точна формула - мога да я намеря, не я носете при мен



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. променете базата данни на „онлайн“ и задайте db на „мултипотребител“

  2. Entity Framework - Размер на реда, по-голям от допустимия максимален размер на реда от 8060

  3. Какво е @@TEXTSIZE в SQL Server?

  4. Откриване на кръгови препратки в SQL

  5. Как да използвате OBJECT_ID() за кръстосани обекти от бази данни в SQL Server