MySQL将度、分、秒转换为十进制
我有多行度分秒,需要通过查询进行转换 36°19'11.46英寸N=36.31985 95°36'02.22英寸宽=95.600617MySQL将度、分、秒转换为十进制,mysql,decimal,degrees,Mysql,Decimal,Degrees,我有多行度分秒,需要通过查询进行转换 36°19'11.46英寸N=36.31985 95°36'02.22英寸宽=95.600617 每一行都将是不同的。这件事我已经坚持了两天了。这是可能的吗?以下方法应该有效: SELECT D + M/60 + S/3600; 例如,在MySQL中: SELECT 36 + 19/60 + 11.46/3600; 返回:36.319850Nice lifehack:使用秒到秒的内置MySQL函数反向解决问题(到DMS的程度): CREATE FUNC
每一行都将是不同的。这件事我已经坚持了两天了。这是可能的吗?以下方法应该有效:
SELECT D + M/60 + S/3600;
例如,在MySQL中:
SELECT 36 + 19/60 + 11.46/3600;
返回:36.319850Nice lifehack:使用秒到秒的内置MySQL函数反向解决问题(到DMS的程度):
CREATE FUNCTION `geocoords`(lon double, lat double) RETURNS varchar(24) CHARSET cp1251
NO SQL
DETERMINISTIC
begin
declare alon double;
declare alat double;
declare slon varchar(12);
declare slat varchar(12);
set alon = abs(lon);
set alat = abs(lat);
set slon = TIME_FORMAT(SEC_TO_TIME(alon*3600), '%H°%i''%s"');
set slat = TIME_FORMAT(SEC_TO_TIME(alat*3600), '%H°%i''%s"');
if lon>0 then
set slon = concat(slon, 'E');
elseif lon<0 then
set slon = concat(slon, 'W');
end if;
if lat>0 then
set slat = concat(slat, 'N');
elseif lat<0 then
set slat = concat(slat, 'S');
end if;
return concat(slat, ' ', slon);
end
CREATE函数`geocoords`(lon-double,lat-double)返回varchar(24)字符集cp1251
无SQL
确定性
开始
宣布阿隆加倍;
宣布alat加倍;
声明slon varchar(12);
宣布slat varchar(12);
设置alon=abs(lon);
设置alat=abs(横向);
设置slon=时间格式(秒到时间(alon*3600),“%H°%i”“%s”);
设置slat=时间格式(秒到时间(alat*3600),“%H°%i”“%s”);
如果lon>0,则
设置slon=concat(slon,'E');
艾尔塞夫:那么
设置缝翼=concat(缝翼,'N');
elseif lat我最终构建了这个,它完美地满足了我的需要。您会注意到,我在数字中添加了一个C,这是为了标记它们,因此如果它已经被转换,它将不会继续转换
UPDATE
MasterTable
SET
MasterTable.Latitude_A = MasterTable.Latitude,
MasterTable.Longitude_A = MasterTable.Longitude
WHERE
ProjectID = 'ProjectAlpha'
and Sequence = '0'
and MasterTable.Latitude NOT LIKE '%C%'
and MasterTable.Longitude NOT LIKE '%C%';
TRUNCATE TABLE gpsconvert;
INSERT into gpsconvert(gpsconvert.`Account Number`,gpsconvert.Latitude,gpsconvert.Longitude)
SELECT
MasterTable.AccountNumber,
MasterTable.Latitude,
MasterTable.Longitude
FROM
MasterTable
WHERE
MasterTable.ProjectID = 'ProjectAlpha'
and MasterTable.Sequence = '0'
and MasterTable.Latitude NOT LIKE '%c%'
and MasterTable.Longitude NOT LIKE '%c%'
and MasterTable.Latitude <> ''
and MasterTable.Longitude <> '';
UPDATE
gpsconvert
SET
gpsconvert.LatDegree = LEFT(gpsconvert.Latitude,2),
gpsconvert.LatMinutes = SUBSTRING(gpsconvert.Latitude,-7,2),
gpsconvert.LatSeconds = SUBSTRING(gpsconvert.latitude,-5,5),
gpsconvert.LatDecimal = gpsconvert.LatDegree + (gpsconvert.LatMinutes/60) + (gpsconvert.LatSeconds/3600),
gpsconvert.LongDegree = LEFT(gpsconvert.Longitude,2),
gpsconvert.LongMinutes = SUBSTRING(gpsconvert.Longitude,-7,2),
gpsconvert.LongSeconds = SUBSTRING(gpsconvert.Longitude,-5,5),
gpsconvert.LongDecimal = gpsconvert.LongDegree + (gpsconvert.LongMinutes/60) + (gpsconvert.LongSeconds/3600);
UPDATE
MasterTable
INNER JOIN
gpsconvert on gpsconvert.`Account Number` = MasterTable.AccountNumber
SET
MasterTable.Latitude = CONCAT(gpsconvert.LatDecimal,'c'),
MasterTable.Longitude = CONCAT(gpsconvert.LongDecimal,'c')
WHERE
MasterTable.ProjectID = 'ProjectAlpha'
and MasterTable.Sequence = '0'
and MasterTable.AccountNumber = gpsconvert.`Account Number`
更新
主表
设置
MasterTable.Latitude_A=MasterTable.Latitude,
MasterTable.Longitude_A=MasterTable.Longitude
哪里
ProjectID='ProjectAlpha'
和序列='0'
和主表。纬度与“%C%”不同
和MasterTable。经度与“%C%”不同;
截断表gpsconvert;
插入gpsconvert(gpsconvert.`Account Number`,gpsconvert.Latitude,gpsconvert.Longitude)
挑选
MasterTable.AccountNumber,
主桌,纬度,
主表经度
从…起
主表
哪里
MasterTable.ProjectID='ProjectAlpha'
和主表。序列='0'
和主表。纬度与“%c%”不同
和MasterTable。经度与“%c%”不同
和MasterTable。纬度“
和主表。经度“;
更新
gpsconvert
设置
gpsconvert.LatDegree=左侧(gpsconvert.Latitude,2),
gpsconvert.LatMinutes=子串(gpsconvert.Latitude,-7,2),
gpsconvert.LatSeconds=子串(gpsconvert.latitude,-5,5),
gpsconvert.LatDecimal=gpsconvert.LatDegree+(gpsconvert.LatMinutes/60)+(gpsconvert.LatSeconds/3600),
gpsconvert.LongDegree=左侧(gpsconvert.LongDegree,2),
gpsconvert.LongMinutes=子字符串(gpsconvert.LongMinutes,-7,2),
gpsconvert.LongSeconds=子字符串(gpsconvert.LongSeconds,-5,5),
gpsconvert.LongDecimal=gpsconvert.LongDegree+(gpsconvert.LongMinutes/60)+(gpsconvert.LongSeconds/3600);
更新
主表
内连接
gpsconvert on gpsconvert.`Account Number`=MasterTable.AccountNumber
设置
MasterTable.Latitude=CONCAT(gpsconvert.LatDecimal,'c'),
MasterTable.Longitude=CONCAT(gpscovert.LongDecimal,'c')
哪里
MasterTable.ProjectID='ProjectAlpha'
和主表。序列='0'
和MasterTable.AccountNumber=gpsconvert.`账号`
这会将格式为21°48'6.384“的字符串转换为十进制
CREATE FUNCTION database.DMS_TO_DECIMAL(dms varchar(20))
RETURNS decimal(12,9)
BEGIN
DECLARE deg decimal(12,9);
DECLARE mins decimal(12,9);
DECLARE secs decimal(12,9);
SET deg = CAST( SUBSTRING_INDEX(dms, '°', 1) AS decimal(12,9));
SET mins = CAST( (SUBSTR(dms, POSITION('°' IN dms) + 1, POSITION("'" IN dms) - POSITION('°' IN dms) - 1)) AS decimal(12,9));
SET secs = CAST( (SUBSTR(dms, POSITION("'" IN dms) + 1, POSITION("\"" IN dms) - POSITION("'" IN dms) - 1)) AS decimal(12,9));
RETURN deg + mins/60 + secs/3600;
END
由于每一行都发生了变化,我如何纠正这一点来提取特定的D M S?如果看不到您的表结构,很难回答。但是,它可能是这样的:从tablename中选择degrees+minutes/60+seconds/3600;您需要看些什么来简化这一过程?每个DMS都在表中的一列中的行中。大约有1000行。每行都有自己的值,如36°19'24.52“N,那么下一行将为36°24'12.06”如果所有三个值都作为字符串存储在一个字段中,则需要使用MySQL字符串函数()解析字符串并提取度、分和秒的各个值。好的,我需要将字符串分成3个单独的部分作为DMS,然后应用数学。好的