用于根据出发时间,从始发地和停止顺序的时间计算公交车到达时间的SQL查询

时间:2014-09-30 16:44:49

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我有一个小任务,我需要根据几个条件计算总线的到达时间。 首先,出发时间的格式如下:1530表示15:30或3:30 PM,还有其他例子使用830表示上午8:30。

现在,db表中的其他列保存了从总线到达目的地的时间。例如,可能有830的出发时间和来自原点的时间将是115,这意味着它将在1小时15分钟或945(9:45 AM)到达下一个目的地。 我们需要建立到达时间的最后一个属性是止损单。例如,从A点到B点的路上可能有8个站点,我们需要计算从第2点开始的到达时间。现在,如果停止命令再次为1,我们需要重置到达时间并重新开始,这意味着该行用于另一个目的地。

我想知道是否有可能构建一些可能做这件事的查询,我可以在C#中进行操作,但是如果有任何选项可以在sql中填充到达时间,我会'对每一条建议都要感激不尽。

最后,您可以查看我正在谈论的实际数据库的屏幕截图:

enter image description here

提前致谢,Laziale

2 个答案:

答案 0 :(得分:1)

这是另一个如何写它的例子:

declare @depart int = 1830
declare @time int = 115
declare @sum time;

with CTE_t
as
(
    select 
        TIMEFROMPARTS(left(@depart,len(@depart)/2),right(@depart,2),01,0,0) as DTime,
        dateadd(minute,@time
                , 
                TIMEFROMPARTS(left(@depart,len(@depart)/2),right(@depart,2),01,0,0)) as mySum
)
select 
    t.DTime as DepTime,
    t.mySum as ArriTime
from CTE_t t

答案 1 :(得分:0)

代码:

WITH A AS (SELECT [Route], [StopOrder],
           CAST(LEFT([DepartureTime], LEN([DepartureTime])-2) AS int) AS DTH, CAST(RIGHT([DepartureTime],2) AS int) AS DTM,
           CASE WHEN [TimeFromOrigin]<>0 THEN CAST(LEFT([TimeFromOrigin], LEN([TimeFromOrigin])-2) AS int) ELSE 0 END AS TFOH, CAST(RIGHT([TimeFromOrigin],2) AS int) AS TFOM,
           SUM(CASE WHEN [TimeFromOrigin]<>0 THEN CAST(LEFT([TimeFromOrigin], LEN([TimeFromOrigin])-2) AS int) ELSE 0 END*60 + CAST(RIGHT([TimeFromOrigin],2) AS int)) OVER(PARTITION BY [Route] ORDER BY [StopOrder] ROWS 1 PRECEDING)-CASE WHEN [TimeFromOrigin]<>0 THEN CAST(LEFT([TimeFromOrigin], LEN([TimeFromOrigin])-2) AS int)*60+CAST(RIGHT([TimeFromOrigin],2) AS int) ELSE 0 END AS TT
           FROM tbl_all)
SELECT B.[Route], B.[DepartureTime], B.[StopOrder], B.[TimeFromOrigin],
       CONCAT(CASE WHEN FLOOR((TFOH*60+TFOM-TT)/60)=0 THEN NULL ELSE FLOOR((TFOH*60+TFOM-TT)/60) END, CASE WHEN FLOOR((TFOH*60+TFOM-TT)/60)>0 THEN REPLICATE('0',-(LEN((TFOH*60+TFOM-TT) % 60)-2)) ELSE '' END, (TFOH*60+TFOM-TT) % 60) AS [TimeBetween],
       CONCAT(CASE WHEN DTH+TFOH>24 THEN 0+CASE WHEN DTM+TFOM>=60 THEN 1 ELSE 0 END ELSE DTH+TFOH+CASE WHEN DTM+TFOM>60 THEN 1 ELSE 0 END END,CASE WHEN DTM+TFOM>=60 THEN DTM+TFOM-60 ELSE DTM+TFOM END, REPLICATE('0',-(LEN(CASE WHEN DTM+TFOM>=60 THEN DTM+TFOM-60 ELSE DTM+TFOM END)-2))) AS [ArrivalTime]
FROM tbl_all AS B LEFT OUTER JOIN A ON B.[Route]=A.[Route] AND B.[StopOrder]=A.[StopOrder]