2014-09-30 2 views
2

몇 가지 조건을 기반으로 버스의 도착 시간을 계산해야하는이 작은 작업이 있습니다. 첫째, 출발 시간 형식은 다음과 같습니다. 1530은 15:30 또는 3:30 PM을 의미하고 830은 8:30 AM을 의미합니다.출발 시간, 출발지 및 정지 주문 시간에 따라 버스 도착 시간을 계산하는 SQL 쿼리

이제 db 테이블의 다른 열은 버스가 목적지에 도달하는 시간을 유지합니다. 예를 들어, 출발 시간이 830 일 수 있고 출발 시간이 115 일 때 1 시간 15 분 또는 945 (9:45 AM)에 다음 목적지에 도달 함을 의미합니다. 도착 시간을 작성해야하는 마지막 속성은 정지 주문입니다. 예를 들어, A 지점에서 B 지점으로가는 길에 8 개의 역이있을 수 있으며 두 번째 지점부터 도착 시간을 계산해야합니다. 이제 정지 주문이 다시 1 인 경우 도착 시간을 재설정하고 다시 시작해야합니다. 행이 다른 목적지를 의미합니다.

나는이 일을 할 수있는 몇 가지 쿼리를 작성할 가능성이 있는지 알고 싶습니다. C#에서 작업을 수행 할 수 있지만, SQL에 채워지는 도착 시간 옵션이 있으면 모든 조언에 감사해야한다.

마지막으로, 당신은 내가 이야기하고있는 실제 DB의 스크린 샷을 확인할 수 있습니다, 사전에

enter image description here

감사 Laziale의를

+0

시도해 보신 검색어를 게시 해 주실 수 있습니까? –

+1

이것은 분명히 SQL로 할 수 있지만 데이터가 현재 배치되어있는 방식에 놀라운 고통이 될 것입니다. 시간 필드에 내장 된 SQL Server를 활용할 수 있도록 이러한 정수 필드를 날짜 필드로 포맷하는 것이 좋습니다. 그렇지 않으면 830이 실제로 뺄셈 목적으로 8.50을 의미한다는 사실을 처리하기 위해 논리의 산을 추가해야 할 것입니다. – DanK

+0

@ jbarker2160 쿼리가 아직 없습니다. SQL이 정확히 필요한 것을 처리 할 수 ​​있는지 확실하지 않기 때문에 큰 소리로 생각하고 있습니다. 어떤 도움을 주셔서 감사합니다 – Laziale

답변

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] 
+0

귀하의 질문에 몇 가지 결과가 나타나고 있습니다. 이제 이해할 필요가 있습니다. btw, 당신은 SQL의 하나님 이니? :) – Laziale

+0

글을 쓸 때 나는 꽤 좋아요. 나머지는별로. PS - 작동하는 경우 녹색 체크 표시를하여 향후 방문자에게이 솔루션이 작동 함을 알립니다. –

+0

곧하겠습니다. 한 가지 더, 1760 대신에 1800을 가질 수 있습니까? 스크린 샷을 확인하십시오. http://gyazo.com/a031ce67ab5bd217f52a76cd26643ca8 감사합니다. @ jbarker2160 – Laziale

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 
+0

Thanks @ paul-kar, 다른 솔루션이 나를 위해 더 잘 작동했습니다. – Laziale

+0

@ 라지 알레 걱정, 행운을 비네. –

관련 문제