Ponieważ używasz SQL Server 2008, masz geography
dostępny typ danych, który jest przeznaczony dla dokładnie tego rodzaju danych:
DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'
SELECT @source.STDistance(@target)
Daje
----------------------
538404.100197555
(1 row(s) affected)
Mówiąc nam, że z (niedaleko) Londynu do (niedaleko) Edynburga jest około 538 km.
Oczywiście najpierw trzeba będzie się sporo nauczyć, ale kiedy już się o tym przekonasz, jest to o wiele łatwiejsze niż wdrażanie własnych obliczeń Haversine; plus zyskujesz DUŻO funkcjonalności.
Jeśli chcesz zachować istniejącą strukturę danych, nadal możesz użyć STDistance
, konstruując odpowiednią geography
instancje za pomocą Point
metoda:
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