[英]MySQL calculate time difference between multiple rows based on status field
[英]Calculate time difference based on status change and day change
我试图根据以下数据获取骑手的在线时间,但我无法满足更改日期的需要。 status = 1 表示骑手在线,0 表示离线。 有时,骑手忘记在他们的班次结束时标记他们的离线状态,即 0,但在第二天早上他们必须开始新班次时这样做。
我正在使用下面的查询来获取时差,但此查询还会计算变化日期之间的时差。 我希望它计算为如果任何骑手当天的最后状态不为 0,它应该自动将最后一次登录时间作为注销时间。
SELECT
fleet_id,
login_time,
logout_time,
timediff(logout_time, login_time) AS logged_in_time,
(unix_timestamp(logout_time) - unix_timestamp(login_time))/60 AS minutes_logged_in_time
FROM
(SELECT
fleet_id,
creation_datetime AS login_time,
coalesce(
(SELECT creation_datetime
FROM tb_fleet_duty_logs t_out
WHERE t_out.fleet_id = t_in.fleet_id
AND t_out.creation_datetime >= t_in.creation_datetime
AND t_out.status = 0
ORDER BY creation_datetime
LIMIT 1
),
creation_datetime
) AS logout_time
FROM
tb_fleet_duty_logs t_in
WHERE
status = 1
) AS q1
ORDER BY
fleet_id, login_time
我假设您有一些可用的分析函数和 CTE。 我的印象是status = 0
是登录。 如果不是,则反转case
表达式中的测试。
with data as (
select
fleet_id,
cast(creation_datetime as date) as dt,
count(case when status = 0 then 1 end) over (
partition by fleet_id, cast(creation_datetime as date)
order by creation_datetime asc) as login_count
from tb_fleet_duty_logs
)
select fleet_id,
min(creation_datetime) as login_time,
max(creation_time) as logout_time,
/* ... other calculations ... */
from data
group by fleet_id, dt, login_count
order by fleet_id, login_time;
诀窍是使用时间戳的顺序计算每个骑手每天的登录次数。 之后,您只需要使用简单的分组将成对的行(或单行)折叠到登录/注销时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.