将整数更改为浮点并添加小数点

时间:2013-02-01 19:47:04

标签: sql sql-server-2008 tsql

我在Microsoft SQL Server Management Studio 2008上使用SQL。

在坚果壳中,我收到的坐标数据为115949833,我需要输出为115.949833,因为我需要能够计算纬度和经度坐标之间的里程数。经度和纬度值都保存为整数,没有小数位。我试图将其更改为字符串,以便我可以使用子字符串连接并将其转换为浮点。我已经找出了lat和long值之间里程数的公式,但由于小数点的问题,它不准确。

这是我用于经度的代码:

Cast(substring(str(longitude,1,not null),1,3)+'.'+substring(str(longitude,4,not null),4,9) as float) as longitude

它一直告诉我CAST附近的语法不正确。

我一直在做很多研究,但仍无法找到执行此任务的确切方法。如果有人可以提供任何反馈,提示,帮助等,将不胜感激。谢谢。

***编辑:我需要将名为“Longitude”的整个列转换为浮点或以某种方式在第3个字符和名为“Latitude”的整列之后显示小数,以在第2个字符后显示小数。

例如,现在我的专栏显示:

纬度经度
36158500 115949833
36340000 115914667
36153488 115944875

我需要它看起来像这样:

纬度经度
36.158500 115.949833
36.340000 115.914667
36.153488 115.944875

*的 修改 * 因此,使用Tim Lehner的答案,我已经使用了我的代码并实现了他的答案,但现在我需要弄清楚如何使用新的纬度和经度列来显示里程...我创建了一些临时表来存储我想要的信息基于特定的radio_name,但我无法使用Tim的答案从那些临时表中提取信息。

以下是我正在使用的代码:
         使用[系统]
         GO
         用CTE作为          (SELECT * FROM AVL
         WHERE(DATE_TIME在'01 / 30/2013 00:00:00'和之间          '01 / 30/2013 23:59:59')和radio_name ='MAS7')
        CTE2为
        (选择*,row_number()over(按Date_Time的Vehicle_ID顺序划分)作为RN         来自CTE)

      SELECT *, sqrt((69.1*(previous.Latitude - next.Latitude))*
     (69.1*(previous.Latitude-next.Latitude)) + 
     (69.1*(previous.Longitude-next.Longitude)) *
     cos(next.Latitude/57.3) * (69.1*(previous.longitude-next.Longitude)) *
     cos(next.Latitude/57.3)) as Miles

    From CTE2 as Previous
    Join CTE2 as Next
    On previous.Vehicle_ID = Next.Vehicle_ID
    AND Previous.RN = 
    Next.RN - 1
    SELECT CAST(Latitude / 1000000.0 as decimal(10, 6)) as Latitude, 
    cast(Longitude / 1000000.0 as decimal(10, 6)) as Longitude
    from AVL

实际代码本身可以正常工作和运行,但里程计算使用的是原始的整体纬度/经度数,而不是具有小数点的更新数字。

我尝试在最后一个语句而不是AVL中插入CTE2,它说它是一个无效的对象名。任何指针或提示?...

4 个答案:

答案 0 :(得分:2)

我喜欢使用数据类型:

select 115949833 / 1000000.0
-- returns 115.949833000

然后您可以舍入/截断到您的规范。

将小数点添加到除数将根据datatype precedence的规则将此操作的输出提升为numeric

<强>更新

根据您的测试数据,您可以使用如下查询:

select cast(Latitude / 1000000.0 as decimal(10, 6)) as Latitude
  , cast(Longitude / 1000000.0 as decimal(10, 6)) as Longitude
from MyTable

/*
Returns:
Latitude    Longitude
36.158500   115.949833
36.340000   115.914667
36.153488   115.944875
*/

答案 1 :(得分:1)

你总是想在第3个角色后添加点?使用STUFF函数

DECLARE @v VARCHAR(100)
SELECT @v = '115949833'

SELECT CONVERT(FLOAT,(STUFF(@v,4,0,'.')))

输出

115.949833

另一种方法是乘以0.000001

DECLARE @v VARCHAR(100)
SELECT @v = '115949833'


SELECT CONVERT(INT,@v)  * 0.000001

答案 2 :(得分:0)

我会使用STUFF

select stuff(longitude,4,0,'.') from table

这是Fiddle

如果你需要它浮动,那么只需添加cast:

select cast(stuff(longitude,4,0,'.') as float)  from table
祝你好运。

答案 3 :(得分:0)

SELECT round(substring(longitude,1,3)+'.'+substring(longitude,4,6),6)
FROM TableName