Poiché stai utilizzando SQL Server 2008, hai la geography
tipo di dati disponibile, progettato esattamente per questo tipo di dati:
DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'
SELECT @source.STDistance(@target)
Dà
----------------------
538404.100197555
(1 row(s) affected)
Dicendoci che sono circa 538 km da (vicino) Londra a (vicino) Edimburgo.
Naturalmente ci sarà una certa quantità di apprendimento da fare prima, ma una volta che lo sai è molto più facile che implementare il tuo calcolo Haversine; in più ottieni MOLTE funzionalità.
Se desideri conservare la struttura dati esistente, puoi comunque utilizzare STDistance
, costruendo una geography
adatta istanze utilizzando il Point
metodo:
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