我有登录和注销时间。需要按小时级别(小时)计算登录时间]
样本输入
Login At "2020-03-01 00:11:23"
Logout AT "2020-03-02 00:01:00"
样本输出
Date Hour Login Hours
2020-03-01 0 0.82
2020-03-01 1 1
2020-03-01 2 1
2020-03-01 3 1
2020-03-01 4 1
2020-03-01 5 1
2020-03-01 6 1
2020-03-01 7 1
2020-03-01 8 1
2020-03-01 9 1
2020-03-01 10 1
2020-03-01 11 1
2020-03-01 12 1
2020-03-01 13 1
2020-03-01 14 1
2020-03-01 15 1
2020-03-01 16 1
2020-03-01 17 1
2020-03-01 18 1
2020-03-01 19 1
2020-03-01 20 1
2020-03-01 21 1
2020-03-01 22 1
2020-03-01 23 1
2020-03-02 0 0.02
如果您正在运行MySQL 8.0,则可以通过递归查询来完成。逻辑是在日期范围内的每个小时内进行迭代,并使用login_hours
在每一步中计算timestampdiff()
:
with recursive cte as (
select
date_format(login_at, '%Y-%m-%d %H:00:00') login_at,
logout_at,
timestampdiff(
second,
login_at,
date_format(login_at, '%Y-%m-%d %H:00:00') + interval 1 hour
) / 60 / 60 login_hours
from mytable
union all
select
login_at + interval 1 hour,
logout_at,
timestampdiff(
second,
login_at + interval 1 hour,
least(logout_at, login_at + interval 2 hour)
) / 60 / 60
from cte
where login_at + interval 1 hour < logout_at
)
select date(login_at) date, hour(login_at) hour, round(login_hours, 2) login_hours
from cte
order by login_at
原始数据集:
login_at | logout_at:------------------ | :------------------2020-03-01 00:11:23 | 2020-03-02 00:01:00
查询结果:
日期|小时login_hours:--------- | ---: ----------:2020-03-01 | 0 | 0.812020-03-01 | 1 | 1.002020-03-01 | 2 | 1.002020-03-01 | 3 | 1.002020-03-01 | 4 | 1.002020-03-01 | 5 | 1.002020-03-01 | 6 | 1.002020-03-01 | 7 | 1.002020-03-01 | 8 | 1.002020-03-01 | 9 | 1.002020-03-01 | 10 | 1.002020-03-01 | 11 | 1.002020-03-01 | 12 | 1.002020-03-01 | 13 | 1.002020-03-01 | 14 | 1.002020-03-01 | 15 | 1.002020-03-01 | 16 | 1.002020-03-01 | 17 | 1.002020-03-01 | 18 | 1.002020-03-01 | 19 | 1.002020-03-01 | 20 | 1.002020-03-01 | 21 | 1.002020-03-01 | 22 | 1.002020-03-01 | 23 | 1.002020-03-02 | 0 | 0.02