基于时间戳和lat long的一天行程SQL查询

基于时间戳和lat long的一天行程SQL查询,sql,sql-server,database,stored-procedures,Sql,Sql Server,Database,Stored Procedures,我有一个表,每行都有日期、纬度和经度值。我需要一个sql查询来计算一天内的工作距离 比如说日期2013-03-01我想要总行驶距离 ID DATE LAT LONG V_ID --------------------------------------------------- 123 2013-03-01 06:05:24 45.544 86.544 1 124 2013-03-01 06:15:17 45

我有一个表,每行都有日期、纬度和经度值。我需要一个sql查询来计算一天内的工作距离

比如说日期
2013-03-01
我想要总行驶距离

ID      DATE                  LAT     LONG    V_ID
---------------------------------------------------
123     2013-03-01 06:05:24   45.544  86.544   1
124     2013-03-01 06:15:17   45.676  86.676   1 
125     2013-03-01 06:25:24   46.544  86.544   2
126     2013-03-01 06:38:14   46.651  86.651   2
127     2013-03-02 07:12:04   46.876  86.876   1 
128     2013-03-02 10:38:14   46.871  86.871   1
129     2013-03-02 10:56:14   46.871  86.671   2
130     2013-03-02 15:28:02   46.243  86.871   2
为了计算距离,我编写了一个sql函数:

CREATE FUNCTION [dbo].[fnCalcDistanceKM](@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
 RETURNS FLOAT 
AS
BEGIN

RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END
但是我想要一天内行驶的总距离,对于一天
2013-03-01
我有四行


与此日期类似,日期
2013-03-02
有最后四行,如何计算这些行的距离。

您可以使用带
行号()的自连接来获得这样的行驶距离

查询

;WITH CTE AS 
(
SELECT *,CONVERT(DATE,[Date]) as tday,ROW_NUMBER()OVER(PARTITION BY CONVERT(DATE,[Date]) ORDER BY [Date] ASC) rn
FROM Travel
)
    SELECT T1.tday,SUM([dbo].[fnCalcDistanceKM](T1.lat,T2.lat,T1.long,T2.long)) as dist
    FROM CTE T1
    INNER JOIN CTE T2
        ON T1.tday = T2.tday
        AND T1.rn  = T2.rn -1
    GROUP BY T1.tday
输出

|       tday |               dist |
|------------|--------------------|
| 2013-03-01 | 129.40048639456964 |
| 2013-03-02 |  87.36216677343607 |

请删除mysql标记或sql server标记。不能同时按日期分组然后求和(dbo.fnCalcDistanceKM(…)?您使用的是哪个版本的sql server?如果您使用的是SQL Server 2008+也使用了LEAD,则可以使用
STDistance
@ughai我正在通过上述查询获得距离。。我正在寻找查询,以获得前四行和后四行中的旅行距离(因为前四行有一个日期,而另四行有一个日期),非常感谢。。但我收到错误消息“Msg 3623,16级,状态1,第1行,发生了无效的浮点操作。”我已将字符串值转换为浮点值,如下所示:
SELECT T1.tday,SUM([dbo]。[fnCalcDistanceKM](CONVERT(float,T1.lat),CONVERT(float,T2.lat),CONVERT(float,T1.long),CONVERT(float,T1.long),CONVERT(float,T2.long)))as dist
为什么您的lat和long
VARCHAR
?可能是转换问题,但错误似乎是其他原因。每列都在varcharcheck out中