【问题标题】:SQL Query to distance traveled in a day based on timestamp and lat longSQL查询基于时间戳和经度在一天中行驶的距离
【发布时间】:2015-08-07 08:03:56
【问题描述】:

我有一个表格,每行都有日期和纬度、经度值。我想要一个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 我有顶部 four row 并且我想要在 2013-03-01 中行驶的总距离

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

【问题讨论】:

  • 请去掉mysql标签或sql-server标签。不能两者兼得
  • 按日期分组,然后按 SUM(dbo.fnCalcDistanceKM(...))?
  • 你使用的是哪个版本的sql server?如果您使用的是 SQL Server 2008 +,则可以使用 STDistance
  • @ughai 我正在通过上述查询获得距离。我正在寻找查询以获取前四行和后四行的行驶距离(因为前四行有一个日期,其他有一个)

标签: sql sql-server database stored-procedures


【解决方案1】:

您可以使用 ROW_NUMBER() 的自我加入来获得这样的距离。

SQL Fiddle

查询

;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 |

【讨论】:

  • 非常感谢 .. 但我收到错误消息 3623,第 16 级,状态 1,第 1 行发生了无效的浮点运算。`
  • 我已将字符串值转换为浮动为SELECT T1.tday,SUM([dbo].[fnCalcDistanceKM]( CONVERT(float,T1.lat),CONVERT(float,T2.lat),CONVERT(float,T1.long),CONVERT(float,T2.long) )) as dist
  • 为什么你的经纬度是VARCHAR?可能是转换问题,但错误似乎是其他问题。
  • 每一列都在varchar中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多