Eftersom du använder SQL Server 2008 har du geography
tillgänglig datatyp, som är designad för just denna typ av data:
DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'
SELECT @source.STDistance(@target)
Ger
----------------------
538404.100197555
(1 row(s) affected)
Berättar för oss att det är cirka 538 km från (nära) London till (nära) Edinburgh.
Naturligtvis kommer det att finnas en del att lära sig först, men när du väl vet det är det mycket mycket lättare än att implementera din egen Haversine-beräkning; plus att du får MYCKET funktionalitet.
Om du vill behålla din befintliga datastruktur kan du fortfarande använda STDistance
, genom att konstruera lämplig geography
instanser som använder Point
metod:
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