我正在 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,它说这是一个无效的对象名称。有什么指点或提示吗?...