【问题标题】:Calculate total working hour of employee in sql with only 1 column仅用 1 列计算 sql 中员工的总工作时间
【发布时间】:2019-10-19 18:53:46
【问题描述】:

rider_status 表中的数据如下:

rider_id       online_status    date_time
   2               1            2019-10-17 08:00:40
   3               1            2019-10-17 09:30:30
   2               0            2019-10-17 12:30:40
   2               1            2019-10-17 14:50:50
   2               0            2019-10-17 18:50:50
  • 在线状态 0 = 不工作
  • 在线状态 1 = 工作中

现在我想计算骑手“2”在该特定日期的总工作时间(例如“2019-19-17”)。此外,我想计算该骑手在特定日期范围内的总小时数(例如“2019-10-05”到“2019-10-30”)。

我对 Rider_id '2' 的回答应该是这样的:

12:30:40 - 08:00:40 = 04:30:12
18:50:50 - 14:50:50 = 06:00:00
                      --------
Total working hour  = 10:30:12

【问题讨论】:

  • 指向问题的image 的超链接将被否决,直到阳光普照。请留下您的问题。
  • 您为什么在此处标记 MySQL 和 SQL Server?您真正使用的是哪个 RDBMS?我已删除有冲突的标签,请仅重新标记正确的标签。到目前为止,您尝试过什么来解决这个问题,为什么没有奏效?您手头的问题与php和android有什么关系?这似乎只与sql有关。
  • 我正在使用的 MySQL.. 我想在 php 中使用答案作为 api。并且该 api 将在 android 中使用。
  • 哪个版本的 MySQL?做select version();并在这里分享

标签: mysql sql


【解决方案1】:

假设您将始终获得 1,0,1,0 等的在线状态,那么您可以使用 LEAD() 和 LAG() 将注销与登录匹配。请注意确保您在窗口表达式中使用了用户 ID

https://www.geeksforgeeks.org/mysql-lead-and-lag-function/

这也将适用于 2008 年以后的 MSSQL

然后您可以使用 TIMEDIFF() 来获取两次之间的差异

https://www.w3resource.com/mysql/date-and-time-functions/mysql-timediff-function.php

在 MSSQL 中,您将使用 DATEDIFF(MINUTE,Time1,Time2)

【讨论】:

  • “这也将适用于 2008 年以后的 MSSQL” LEAD/LAG 仅适用于 SQL Server 2012+,不适用于 2008+。所有的analytic functions 都是在 SQL Server 2012 中添加的。
  • 顺便说一句,这是一个 MySQL 问题。
【解决方案2】:

假设1s 和0s 对于每个人都是交错的,您可以使用:

select rider_id,
       sum(timestamp_diff(second, datetime, next_datetime)) as time_in_seconds
from (select t.*, 
             lead(date_time) over (partition by rider_id order by date_time) as next_date_time
      from t
     ) t
where online_status = 1
group by rider_id;

【讨论】:

    【解决方案3】:
          Select rider_id, 
             case when lead(
             online_status) over
             partition by rider_id order by
             riderid, date_time <> online_status
             then 
             lead(date_time)over (partition 
                 by rider_id order by rider_id) 
                    -
                   lag(updatedtime) over (partition 
                 by rider_id order by rider_id) 
    
              End
    
            From table 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多