mysql - 当您在 mysql 或 tableau 中有登录和注销时间戳时,按小时计算登录时间
问题描述
我有登录和注销时间。需要按小时计算登录时间(按小时计算)
样本输入
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
原始数据集:
登录名 | 注销_at :----------------- | :----------------- 2020-03-01 00:11:23 | 2020-03-02 00:01:00
查询结果:
日期 | 小时 | login_hours :--------- | ---: | ----------: 2020-03-01 | 0 | 0.81 2020-03-01 | 1 | 1.00 2020-03-01 | 2 | 1.00 2020-03-01 | 3 | 1.00 2020-03-01 | 4 | 1.00 2020-03-01 | 5 | 1.00 2020-03-01 | 6 | 1.00 2020-03-01 | 7 | 1.00 2020-03-01 | 8 | 1.00 2020-03-01 | 9 | 1.00 2020-03-01 | 10 | 1.00 2020-03-01 | 11 | 1.00 2020-03-01 | 12 | 1.00 2020-03-01 | 13 | 1.00 2020-03-01 | 14 | 1.00 2020-03-01 | 15 | 1.00 2020-03-01 | 16 | 1.00 2020-03-01 | 17 | 1.00 2020-03-01 | 18 | 1.00 2020-03-01 | 19 | 1.00 2020-03-01 | 20 | 1.00 2020-03-01 | 21 | 1.00 2020-03-01 | 22 | 1.00 2020-03-01 | 23 | 1.00 2020-03-02 | 0 | 0.02
推荐阅读
- java - 在 GUI 中打印 ActionListener 的结果
- git - Git - 错误的文件夹结构
- python - 从自定义索引扩展数组
- java - 从 DatePicker java.util.Date Primefaces 获取总天数
- python - 如何引用从循环创建的 Kivy 小部件?
- dlib - 可以将 Dlib 面部尺寸从 128 减半到 64
- python - 如何使用 Python 从表中选择特定值?
- c# - 关于在 Azure 功能上使用 EmguCV
- reactjs - 如何 Firestore 设置多个过滤器/where 子句取决于 React JS 中的用户选择
- typescript - 如何在仍然在 TS 中指定值类型的同时保留隐式键名键入作为接口的一部分?