SQL使用长/纬度&;计算距离;将整数转换为十进制

SQL使用长/纬度&;计算距离;将整数转换为十进制,sql,floating-point,sql-server-2008-r2,latitude-longitude,Sql,Floating Point,Sql Server 2008 R2,Latitude Longitude,原职: 下面是背景:我正在使用一个数据库,该数据库接收来自车辆的GPS坐标,我需要根据经度和纬度值计算出这些车辆的里程数。但是,在数据库中,两列经度/纬度都是“Int/notnull”,没有小数点。所以它们看起来像这样: Latitude Longitude 36158500 115949833 36340000 115914667 36153488 115944875 我需要它看起来像这样: Latitude Longitude 36.158500 115.949833 36.340

原职:

下面是背景:我正在使用一个数据库,该数据库接收来自车辆的GPS坐标,我需要根据经度和纬度值计算出这些车辆的里程数。但是,在数据库中,两列经度/纬度都是“Int/notnull”,没有小数点。所以它们看起来像这样:

Latitude Longitude 
36158500 115949833
36340000 115914667
36153488 115944875
我需要它看起来像这样:

Latitude Longitude 
36.158500 115.949833  
36.340000 115.914667 
36.153488 115.944875
在Tim Lehner的帮助下,我们找到了小数点的计算方法,但我无法使用我已经创建的公式来计算里程数。我必须能够根据radio_名称搜索long/lat值,以便可以单独查看每辆车的里程数,这就是为什么我创建了一个名为CTE和CTE2的临时表。但是,如果我调用temp表,代码将不起作用,因为它说它是无效对象。现在,如果我插入“AVL”(原始表的名称)而不是在下面的最后一条语句中使用CTE2,代码就可以正常工作。但是,里程不是使用新的lat/long值计算的

因此,正如重述:列是纬度,经度。我们需要将这些列转换为在纬度的2个字符后放置一个小数点,在经度的3个字符后放置一个小数点。然后我们需要一个名为Miles的列,它计算给定纬度和经度值之间的里程

非常感谢任何提示、帮助、指点等!谢谢大家!

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 cte2
****编辑****
期望的结果与此类似:

Latitude Longitude  Mileage Radio_Name
36.158500 115.949833 3.444  MAS7
36.340000 115.914667 3.443  MAS7
36.153488 115.944875 4.544  MAS7
(这不是正确的里程数,但它只是我所寻找的结果的一个例子。)

请注意

您当前使用的是CTE或CTE,它们更类似于CTE,因为它们只能用于直接跟随它们的一条select(或insert、update等)语句(尽管您可以为一条语句声明多个CTE,正如您所做的那样)

因此,当您使用第二条select语句时,您的CTE已超出范围,您无法再引用它们(或者必须再次声明它们)。在这种情况下,您可能需要使用或

通过如下转换CTE定义,您可以轻松创建临时表:

-- Make a temp table
SELECT *
INTO #TempTableName -- Create a new temp table
FROM AVL 
WHERE DATE_TIME between '01/30/2013 00:00:00' AND '01/30/2013 23:59:59'
    AND radio_name = 'MAS7'

-- Check out our new temp table
SELECT * FROM #TempTableName

-- Clean up our temp table, though this will automatically happen once the connection is dropped
DROP TABLE #TempTableName
if object_id('tempdb..#TempTableName') is not null begin
    drop table #TempTableName
end
此外,在使用临时表时,我通常会在进程的开始和结束时检查并删除它们,如下所示:

-- Make a temp table
SELECT *
INTO #TempTableName -- Create a new temp table
FROM AVL 
WHERE DATE_TIME between '01/30/2013 00:00:00' AND '01/30/2013 23:59:59'
    AND radio_name = 'MAS7'

-- Check out our new temp table
SELECT * FROM #TempTableName

-- Clean up our temp table, though this will automatically happen once the connection is dropped
DROP TABLE #TempTableName
if object_id('tempdb..#TempTableName') is not null begin
    drop table #TempTableName
end

如果您的代码中有这些内容,请告诉我们您在执行实际距离计算时是否有困难。

您能给出一个所需输出的示例吗?我尝试将代码插入临时表,但仍然无法获得实际里程公式。