[英]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.