我在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,它说它是一个无效的对象名。任何指针或提示?...
答案 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