1

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

简而言之,我正在接收坐标数据,115949833并且我需要将其输出,115.949833因为我需要能够计算纬度和经度坐标之间的里程。经度和纬度值都保存为不带小数位的整数。我试图将其更改为字符串,以便可以使用子字符串连接并将其转换为浮点数。我已经弄清楚了经纬度值之间里程的公式,但由于小数点的问题,它并不准确。

这是我用于经度的代码:

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

它一直告诉我我在CAST.

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

***编辑:我需要将名为“经度”的整个列转换为浮点数或以某种方式在第三个字符之后显示小数点,并且将名为“纬度”的整个列在第二个字符之后显示一个小数点。

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

纬度经度
36158500 115949833
36340000 115914667
36153488 115944875

我需要它看起来像这样:

纬度 经度
36.158500 115.949833
36.340000 115.914667
36.153488 115.944875

*编辑* 所以使用 Tim Lehner 的答案,我已经使用了我的代码并实现了他的答案,但现在我需要弄清楚如何让它使用新的纬度和经度列显示里程......我创建了一些临时表来存储我想要的基于特定无线电名称的信息,但我无法使用蒂姆的回答从这些临时表中提取信息。

这是我正在使用的代码:
USE [system]
GO
With CTE as
(SELECT * FROM AVL
WHERE (DATE_TIME between '01/30/2013 00:00:00' AND
'01/30/2013 23:59:59' ) AND radio_name = 'MAS7') CTE2
as
(select *,row_number() over(partition by Vehicle_ID order by Date_Time) as RN FROM 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

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

我尝试在最后一条语句中插入 CTE2 而不是 AVL,它说这是一个无效的对象名称。有什么指点或提示吗?...

4

4 回答 4

2

我喜欢使用数据类型来发挥我的优势:

select 115949833 / 1000000.0
-- returns 115.949833000

然后,您可以根据您的规范四舍五入/截断。

将小数点添加到除数将根据数据类型优先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
*/
于 2013-02-01T19:53:16.290 回答
1

你总是想在第三个字符之后添加点?使用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
于 2013-02-01T19:51:09.320 回答
0

我会使用STUFF

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

这是小提琴

如果你需要它是浮动的,那么只需添加演员表:

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

祝你好运。

于 2013-02-01T19:52:22.303 回答
0
SELECT round(substring(longitude,1,3)+'.'+substring(longitude,4,6),6)
FROM TableName
于 2013-02-01T20:08:11.437 回答