MySQL将度、分、秒转换为十进制

MySQL将度、分、秒转换为十进制,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

我有多行度分秒,需要通过查询进行转换

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.319850

Nice 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,然后应用数学。好的