2016-09-14 131 views
0

我试图将数据从一个数据库中的表移动到另一个数据库。除了以H:MM格式设置为字符(6)的旅行时间字段获取总旅行时间外,一切都很顺利。我需要为指定日期(按会话日期给出)为路线中的每个停靠点(由调度编号给出)计算出行程时间,并将其总计在该路线的新字段中。SQL:总结时间字段是char类型的时间

下面是我想要做的(当然求和不会工作的焦域)

SELECT 
    [session_date], [dispatch_number], [stop_number], 
    [scheduled_arrival], [route_start], [customer_id], 
    [distance], [travel_time], [service_time], 
    [driver], 
    (SELECT SUM([travel_time]) 
    FROM [exampleDB] 
    WHERE [dispatch_number] = [dispatch_number] 
     AND [session_date] = [session_date]) AS total_drive_time 
FROM 
    [exampleDB] 

我将不胜感激任何帮助,感谢您的时间。

回答

1

首先,你可以这样写不使用窗函数的相关子查询:

select e.*, 
     sum(travel_time) over (partition by dispatch_number, session_date) as total_drivetime 
from exampleDB; 

当然,这并不解决问题 - 这是增加了VARCHAR处理。您可以将其转换为时间,然后转换为分钟:

select e.*, 
     sum(datediff(minute, '00:00', convert(time, travel_time))) over 
      (partition by dispatch_number, session_date 
      ) as total_drivetime_min 
from exampleDB; 

如果分钟数足够,则可以解决您的问题。

+0

非常感谢您的帮助,并对其进行了一些编辑以适应正常运行的任务。 – Ryiun

0

或许,这可以帮助

Select Cast(DateAdd(MS,Sum(DateDiff(MS,'00:00:00.000',Cast([travel_time] as Time))),'00:00:00.000') as Time) 
From [exampleDB] 
Where [dispatch_number]=[dispatch_number] 
    and [session_date]=[session_date]) AS total_drive_time 

要看到一个快速的样品,

Declare @YourTable table (TimeString varchar(25)) 
Insert Into @YourTable values 
('6:30'), 
('1:30') 

Select Cast(DateAdd(MS,Sum(DateDiff(MS,'00:00:00.000',Cast(TimeString as Time))),'00:00:00.000') as Time) 
From @YourTable 

返回

08:00:00.0000000 
0

如果你需要你的结果也为HH:MM,然后尝试与下面的查询。

;WITH cte_1 AS 
(
    SELECT [dispatch_number],[session_date], SUM(DATEDIFF(MINUTE, '0:00:00', [travel_time]+':00'))total_drive_timeInMin 
    FROM dbo.[exampleDB] 
    GROUP BY [dispatch_number],[session_date] 
) 
SELECT e.[session_date] 
    ,e.[dispatch_number] 
    ,[stop_number] 
    ,[scheduled_arrival] 
    ,[route_start] 
    ,[customer_id] 
    ,[distance] 
    ,[travel_time] 
    ,[service_time] 
    ,[driver] 
    , RTRIM(total_drive_timeInMin/60) + ':' + RIGHT('0' + RTRIM(total_drive_timeInMin%60),2) total_drive_timeIn 
FROM cte_1 c 
JOIN [exampleDB] e ON c.[dispatch_number]=e.[dispatch_number] 
    AND c.[session_date]=e.[session_date]