Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

znajdź najbliższą lokalizację w ms-sql

Użyj tej funkcji

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

Możesz zamawiać za pomocą tej funkcji, ALE w przypadku dużych zestawów danych będzie to bardzo powolne, więc spróbuj wstępnie przefiltrować zestaw rekordów

UPD:

Korzystając z danych testowych @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))

Zakładając, że Ziemia NIE jest geoidą, ale okrągłą kulą, jeśli potrzebujesz dokładnego wzoru poniżej 1m - mogę ją znaleźć, nie miej jej przy sobie



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wypisz ciąg znaków w SQL Server, aby można go było bezpiecznie używać w wyrażeniu LIKE

  2. Wybierz rozmiar bazy danych SQL Server

  3. CURRENT_TIMESTAMP Przykłady w SQL Server (T-SQL)

  4. SQL:Użyj pól obliczeniowych z SELECT w klauzuli WHERE

  5. Usuń nagłówek kolumny z wyniku zapytania SQL Server