Firebird SQL - 将十进制Long Lat co-oords转换为Deg mins secs

时间:2015-12-02 14:24:09

标签: sql firebird

我有一个存储在表中的经度和纬度列,我需要使用SQL进行转换。该数据库是Firebird。

值分别为31.22027777777778和-29.53805555555556。

我的输出应该是

Longitude
E 31 deg 13 min 13.00 sec

Latitude 
S 29 deg 32 min 17.00 sec

当然这应该检查Latitude上的正小数,它会转换为'N'而不是'S'等。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

此解决方案基于How to convert Geometry type column to degree Minutes Second in SQL Server 2008 R2

CREATE TABLE #tab(longitude DECIMAL(38,18), latitude DECIMAL(38,18));

INSERT INTO #tab
VALUES (31.22027777777778 , -29.53805555555556);


SELECT longitude, latitude, CAST(FLOOR(ABS(longitude)) as varchar) + ' ' +
    CAST(CAST(FLOOR(ABS(longitude) * 60) AS INT) % 60 as varchar) + ''' ' +
    CAST(CAST(FLOOR(ABS(longitude) * 3600) AS INT) % 60 AS VARCHAR) + '"' +
    CASE WHEN longitude < 0 then ' W' ELSE ' E' END,
  CAST(FLOOR(ABS(latitude)) as varchar) + ' ' +
    CAST(CAST(FLOOR(ABS(latitude) * 60) AS INT) % 60 as varchar) + ''' ' +
    CAST(CAST(FLOOR(ABS(latitude) * 3600) AS INT) % 60 AS VARCHAR) + '"' +
    CASE WHEN latitude < 0 then ' S' ELSE ' N' END 
FROM #tab;

LiveDemo

使用了modulo division/FLOOR/ABS之类的基本数字操作。我想你可以将它翻译成Firebird方言。

奖金SQLServer2012+

SELECT 
 longitude,
 latitude, 
 [longitude_dms] = FORMATMESSAGE('%i %i'' %i.00" %s',
                                CAST(FLOOR(ABS(longitude)) AS INT),
                                CAST(FLOOR(ABS(longitude) * 60) AS INT) % 60,
                                CAST(FLOOR(ABS(longitude) * 3600) AS INT) % 60,
                                IIF(longitude < 0, 'W', 'E')),
 [latitude_dms] = FORMATMESSAGE('%i %i'' %i.00" %s',
                                CAST(FLOOR(ABS(latitude)) AS INT),
                                CAST(FLOOR(ABS(latitude) * 60) AS INT) % 60,
                                CAST(FLOOR(ABS(latitude) * 3600) AS INT) % 60,
                                IIF(latitude < 0, 'S', 'N'))
FROM #tab;

LiveDemo2