sql >> Databáze >  >> RDS >> Sqlserver

najít nejbližší umístění v ms-sql

Použijte tuto funkci

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

Můžete objednávat pomocí této funkce, ALE na velkých souborech dat to bude velmi pomalé, takže zkuste předfiltrovat sadu záznamů

UPD:

Pomocí testovacích dat @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))

Předpokládejme, že Země NENÍ geoid, ale kulatá koule, pokud potřebujete přesný vzorec pod 1 m – najdu ho, nemějte ho u sebe



  1. ukládání souborů na SQL Server 2008 pomocí možnosti filestream

  2. zsh:příkaz nenalezen:mysql

  3. Jak změnit hodnoty pro úpravy horních X a výběr horních X řádků v SQL Server Management Studio (SSMS) - SQL Server / Výukový program TSQL, část 20

  4. PHP mění starý mysql_query na PDO