Firebird SQL - 将十进制经纬度坐标转换为度分秒
Firebird SQL - Convert decimal Long Lat co-oords to Deg mins secs
我有一个经度和纬度列存储在 table 中,我需要使用 SQL 进行转换。数据库是火鸟。
值分别为 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' 等
如有任何帮助,我们将不胜感激。
此解决方案基于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;
使用了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;
我有一个经度和纬度列存储在 table 中,我需要使用 SQL 进行转换。数据库是火鸟。
值分别为 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' 等
如有任何帮助,我们将不胜感激。
此解决方案基于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;
使用了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;