Тъй като използвате SQL Server 2008, имате geography
наличен тип данни, който е предназначен за точно този тип данни:
DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'
SELECT @source.STDistance(@target)
Дава
----------------------
538404.100197555
(1 row(s) affected)
Казва ни, че е на около 538 км от (близо) Лондон до (близо) Единбург.
Естествено, първо ще трябва да се научите, но след като го разберете, е много по-лесно, отколкото да приложите собственото си изчисление на Haversine; плюс получавате МНОГО функционалност.
Ако искате да запазите съществуващата си структура от данни, все още можете да използвате STDistance
, чрез изграждане на подходяща geography
екземпляри, използващи Point
метод:
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