我有一个存储在表中的经度和纬度列,我需要使用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'等。
非常感谢任何帮助。
答案 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
强>