No se si a ustedes les ha pasado, pero he necesitado convertir coordenadas en grados, minutos y segundos a decimales, o lo que llaman UTM, especialmente esto suele estar almacenado en una base de datos, y claro convertirlo puede ser un problema y mas cuando son bases de datos de producción, la solución? Una función que haga esta conversion y esta incluirla en una vista, y bien aqui esta la función para SQL Server 2005 en adelante, si necesitan podría pasarla a Oracle tambien…
CREATE FUNCTION ConvertirDMS
(
-- Add the parameters for the function here
@strData varchar(500)
)
RETURNS decimal(10,8)
AS
BEGIN
DECLARE @decResult decimal(10,8)
declare @posD int
declare @posDQ int
declare @posM int
declare @posS int
declare @piece varchar(500)
declare @decD decimal(10,8)
declare @decM decimal(10,8)
declare @decS decimal(10,8)
declare @strSign varchar(2)
--Ubica el signo de grados
set @posD = patindex('%°%' , @strData)
--Ubica el signo de grados cuando esta mal puesto
set @posDQ = patindex('%?%' , @strData)
--Ubica el sigo de minutos
set @posM = patindex('%"%' , @strData)
--Ubica el sigo de minutos
set @posS = patindex('%''%' , @strData)
-- Saca los segundos y los convierte a decimal
set @decS = CONVERT(decimal(10,8), substring(@strData, @posM + 1, @posS - @posM - 1))
-- Saca los minutos y los convierte a decimal
if(@posDQ = '0')
set @decM = CONVERT(decimal(10,8), substring(@strData, @posD + 1, @posM - @posD - 1))
else
set @decM = CONVERT(decimal(10,8), substring(@strData, @posDQ + 1, @posM - @posDQ - 1))
-- Saca los minutos y los convierte a decimal
if(@posDQ = '0')
set @decD = CONVERT(decimal(10,8), substring(@strData, 0, @posD))
else
set @decD = CONVERT(decimal(10,8), substring(@strData, 0, @posDQ))
--Saca la orientacion para el signo
set @strSign = SUBSTRING(@strData, @posS + 1, len(@strData) - @posS)
--Calcula los segundos a minutos
set @decM = @decM + (@decS / 60.00)
--Calcula los minutos a grados
set @decResult = @decD + (@decM / 60.00)
--Pone el signo
if (upper(@strSign) <> 'N' and UPPER(@strSign) <> 'E')
set @decResult = @decResult * -1
RETURN @decResult;
END