SQL Server 2019中BIGINT转Decimal实现经纬度格式转换求助
解决SQL Server中BIGINT转经纬度Decimal的问题
你遇到的问题核心是没有先对BIGINT值做缩放处理——这些数值是把原经纬度的小数点去掉后得到的,所以需要先除以10^6(即1000000),再转换为Decimal类型。
正确转换方法
直接对BIGINT值执行除法运算后再转换:
-- 处理经度值-111021037 CAST(-111021037 / 1000000.0 AS DECIMAL(10,6)) -- 处理纬度值32409460 CAST(32409460 / 1000000.0 AS DECIMAL(10,6))
也可以用更严谨的写法,先转成浮点型再做除法,避免整数除法的截断问题:
CAST(CAST(-111021037 AS FLOAT) / 1000000 AS DECIMAL(10,6)) CAST(CAST(32409460 AS FLOAT) / 1000000 AS DECIMAL(10,6))
之前错误的原因分析
使用
CAST(-111021037 AS DECIMAL(10,6))报错:
DECIMAL(10,6)的总位数是10,其中小数位占6位,整数位最多只能有4位(10-6=4),而-111021037是9位整数,远超过4位的上限,因此触发算术溢出错误。使用
CAST(-111021037 AS DECIMAL(15,6))得到-111021037.000000:
这个操作只是给原整数添加了6位小数后缀,并没有改变数值的实际大小,自然无法得到带小数点的目标经纬度值。
批量更新表数据的示例(如果需要修改表中字段)
假设你的表名为LocationTable,存储原始BIGINT值的字段是LongitudeBigInt和LatitudeBigInt,可以按以下步骤新增并更新Decimal类型的经纬度字段:
-- 先添加Decimal类型的经纬度字段 ALTER TABLE LocationTable ADD Longitude DECIMAL(10,6), Latitude DECIMAL(10,6); -- 批量更新转换后的数据 UPDATE LocationTable SET Longitude = CAST(LongitudeBigInt / 1000000.0 AS DECIMAL(10,6)), Latitude = CAST(LatitudeBigInt / 1000000.0 AS DECIMAL(10,6));
内容的提问来源于stack exchange,提问作者D. Harms
相关产品推荐
相关产品推荐

