簡體   English   中英

根據狀態變化和日期變化計算時差

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM