2017-02-27 66 views
1

我有一个存储登录和注销时间的表。我想根据每个小时分割总持续时间。 该表是像如何根据mysql中的小时数分割登录和注销时间

id | tutor_id | login_time   | logout_time 
1 | 12  |'2017-02-20 11:20:20' | '2017-02-20 12:10:00' 
2 | 13  |'2017-02-20 11:25:20' | '2017-02-20 12:20:00' 
3 | 12  |'2017-02-20 13:20:20' | '2017-02-20 13:50:00' 
4 | 13  |'2017-02-20 12:30:20' | '2017-02-20 12:50:00' 
5 | 13  |'2017-02-20 13:10:20' | '2017-02-20 14:20:00' 

我想登录在几分钟的持续时间在该小时对于每个tutor_id。

输出应该像

tutor_id| hour | Duration(mins) 
12  | 11 | 40 
12  | 12 | 10 
12  | 13 | 30 
13  | 11 | 35 
13  | 12 | 30 
13  | 13 | 50 
13  | 12 | 20 
+0

您是使用MySQL还是MS SQL Server? – jarlh

+0

我相信你会需要一个日历表。 –

+0

我正在使用MySQL @jarlh –

回答

1

你可以试试下面的方法使用日期。

我创建了一个临时表像之下,

create table schedule_temp as 
select id, tutor_id, login, logout, 
     case 
     when Extract(hour from logout) > Extract(hour from login) 
      then 1 
     else 0 
     end isUnionRequired 
from schedule_table 

然后使用该临时表中,我使用下面的查询,以获得期望的结果

select tutor_id, hour, sum(minute_value) Duration 
from(
    select tutor_id, login, Extract(hour from login) hour, 60-Extract(minute from login) minute_value 
    from schedule_temp 
    where isUnionRequired = 1 
    union all 
    select tutor_id, login, Extract(hour from login), Extract(minute from logout) - Extract(minute from login) 
    from schedule_temp 
    where isUnionRequired = 0 
    union all 
    select tutor_id, logout, Extract(hour from logout), Extract(minute from logout) 
    from schedule_temp 
    where isUnionRequired = 1) t1 
group by tutor_id, hour; 

上述查询给我下面结果

我得到了如下的结果,

enter image description here

您可以简单地将这整个流程存入存储过程。

-1

内置函数

CREATE TABLE #Table(id INT,tutor_id INT, login_time DATETIME, logout_time 
DATETIME) 

INSERT INTO #Table(id ,tutor_id ,login_time,logout_time) 
SELECT 1 ,12,'2017-02-20 11:20:20' ,'2017-02-20 12:10:00' UNION ALL 
SELECT 2 ,13,'2017-02-20 11:25:20' ,'2017-02-20 12:20:00' UNION ALL 
SELECT 3 ,12,'2017-02-20 13:20:20' ,'2017-02-20 13:50:00' UNION ALL 
SELECT 4 ,13,'2017-02-20 12:30:20' ,'2017-02-20 12:50:00'UNION ALL 
SELECT 5 ,13,'2017-02-20 13:10:20' ,'2017-02-20 14:20:00' 

SELECT tutor_id , EXTRACT(HOUR, login_time) ,  
DATEDIFF(MINUTE,login_time,logout_time) 
FROM #Table 
+1

这远远不符合要求。只需要记录第一个记录。你会报告这是'十一小时有50分钟。但实际上,OP在10分钟内需要40分钟和12小时的“11小时”。 –