Como você está usando o SQL Server 2008, você tem a
geography
tipo de dados disponível, projetado exatamente para esse tipo de dados:DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'
SELECT @source.STDistance(@target)
Dá
----------------------
538404.100197555
(1 row(s) affected)
Dizendo-nos que são cerca de 538 km de (perto) de Londres a (perto) de Edimburgo.
Naturalmente, haverá muito a aprender primeiro, mas uma vez que você sabe disso, é muito mais fácil do que implementar seu próprio cálculo de Haversine; além disso, você obtém MUITAS funcionalidades.
Se você quiser manter sua estrutura de dados existente, ainda poderá usar
STDistance
, construindo uma geography
adequada instâncias usando o Point
método:DECLARE @orig_lat DECIMAL(12, 9)
DECLARE @orig_lng DECIMAL(12, 9)
SET @orig_lat=53.381538 set @orig_lng=-1.463526
DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326);
SELECT *,
@orig.STDistance(geography::Point(dest.Latitude, dest.Longitude, 4326))
AS distance
--INTO #includeDistances
FROM #orig dest