2017-02-08 3 views
0

У меня есть данные в таблице с длинной длиной, как показано ниже. Как мы можем преобразовать их в десятичные числа, такие как 43.360556 и -5.848889, используя SQL-запрос.LAt До десятичной степени в SQL Server 2016

Latitude   Longitude 
43-21-33.87-N 05-51-43.13-W 
+0

Нет, я рассмотрел это уже ..не полезно для меня – user1046415

ответ

2

Десятичные градусы = Градусы + минут/60 + секунд/3600

Математика очень проста, так что я бы создать UDF, но вы можете использовать что-то вроде этого

Пример

Declare @YourTable Table (ID int,Lat varchar(25),Lng varchar(25)) 
Insert Into @YourTable values 
(1,'43-21-33.87-N','05-51-43.13-W') 

Select A.* 
     ,B.Lat 
     ,C.Lng 
From @YourTable A 
Cross Apply (
       Select Lat=(xDim.value('/x[1]','float') 
          +xDim.value('/x[2]','float')/60.0 
          +xDim.value('/x[3]','float')/3600.0 
         )* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1) 
       From (Select Cast('<x>' + replace((Select replace(A.Lat,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
      ) B 
Cross Apply (
       Select Lng=(xDim.value('/x[1]','float') 
          +xDim.value('/x[2]','float')/60.0 
          +xDim.value('/x[3]','float')/3600.0 
         )* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1) 
       From (Select Cast('<x>' + replace((Select replace(A.Lng,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
      ) C 

Возвращает

ID Lat    Lng    DecLat  DecLng 
1 43-21-33.87-N 05-51-43.13-W 43.3594166 -5.8619722 

EDIT Создано UDF (только для развлечения)

CREATE FUNCTION [dbo].[udf-Geo-DMS-Decimal] (@S varchar(max)) 
Returns Float 
AS 
Begin 
    Return (
      Select (xDim.value('/x[1]','float') 
        +xDim.value('/x[2]','float')/60.0 
        +xDim.value('/x[3]','float')/3600.0 
        )* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1) 
      From (Select Cast('<x>' + replace((Select replace(@S,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
      ) 
End 
-- Syntax : Select [dbo].[udf-Geo-DMS-Decimal]('43-21-33.87-N') 
-- Syntax : Select [dbo].[udf-Geo-DMS-Decimal]('05-51-43.13-W') 
+1

Потрясающие .. Спасибо большое – user1046415

+0

@ user1046415 Днем это помогло –

Смежные вопросы