Десятичные градусы = Градусы + минут/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')
Нет, я рассмотрел это уже ..не полезно для меня – user1046415