我有一个应用程序,它将登录和注销datetimestamps记录到mysql数据库中。每个用户登录和注销都是一行。我需要创建一个报告,按用户和小时显示每个用户登录的分钟数。我可以通过在两个时间戳之间使用TIMESTAMPDIFF然后在其中一个时间戳上按小时分组来弄清楚如何执行此操作。但是当登录可能是11:53并且注销可能是13:06时,我不知道该怎么做。第11小时应该显示7分钟,第12小时显示60分钟,第13小时显示6分钟。相反,我现在这样做的方式将在第11小时显示73分钟(如果我按登录时间分组)。
答案 0 :(得分:0)
如果您创建另一个表,其中包含您可能需要报告的所有小时数作为时间戳,则最容易做到这一点。假设此表是小时表,其中的时间戳列是小时
然后你想要一个像这样的查询:
select hour, userid,
case
when login < hour and logout >= ADDTIME(hour,'1:00:00.0') then '1:00:00.0'
when login >= hour and logout < ADDTIME(hour, '1:00:00.0')then TIMEDIFF(logout, login)
when login >= hour and logout > ADDTIME(hour, '1:00:00.0') then TIMEDIFF(ADDTIME(hour, '1:00:00.0'), login)
when login < hour and logout < ADDTIME(hour, '1:00:00.0') then TIMEDIFF(logout, hour)
else '00:00:00.0'
end case
from hourlist join loginlogout
on (login >= hour and login < ADDTIME(hour,'1:00:00.0')) or (logout >= hour
and logout < ADDTIME(hour,ADDTIME(hour,'1:00:00.0'))
order by hour