我有一个小任务,我需要根据几个条件计算总线的到达时间。 首先,出发时间的格式如下: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中填充到达时间,我会'对每一条建议都要感激不尽。
最后,您可以查看我正在谈论的实际数据库的屏幕截图:
提前致谢,Laziale
答案 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]