获取一天的总工作时间,总小时数,总小时数mysql [重复]

Posted

技术标签:

【中文标题】获取一天的总工作时间,总小时数,总小时数mysql [重复]【英文标题】:Get total hours worked in a day, total in hours, total out hours mysql [duplicate] 【发布时间】:2016-11-25 05:27:57 【问题描述】:

我有一个 mysql 表,其中记录了员工进出时间。

id     device_id           punch          stat_log
 1       26           2016-11-23 11:30:05    in
 2       26           2016-11-23 14:30:05    out
 3       26           2016-11-23 15:00:05    in
 4       26           2016-11-23 20:32:05    out

是否可以使用单个查询从用户工作的总小时数中检索总小时数和总小时数?

我使用了以下查询:

SELECT 
        device_id as d_id, 
        date(run_start) as start_date, 
        sum(elapsed_min)/60.0 as hrs_on, 
        24 - sum(elapsed_min)/60.0 as hrs_off
   FROM
       (SELECT *, TIMESTAMPDIFF(minute, run_start, run_end) elapsed_min
       FROM 
            (SELECT t1.device_id, t1.punch as run_start, 
                  (SELECT MIN(punch) 
                   FROM emp_punch_in_out t2 
                   LEFT JOIN emp_map e ON e.device_id = t2.device_id
                   WHERE t2.device_id = t1.device_id
                   AND t2.punch > t1.punch
                   AND t2.stat_log = 'out') as run_end
            FROM emp_punch_in_out t1
            WHERE t1.device_id = 26 AND t1.stat_log = 'in') t
      ) tt 
      GROUP BY device_id, start_date
      ORDER BY device_id, start_date

从这个查询中我得到如下结果:

#ID device_id       Date          In_hours     Out_hours
 1     26         2016-11-23       8.5333      15.4667

但我想要的结果是总小时数和一天中工作时间的总小时数,包括休息时间。

期望的输出

#ID device_id       Date          In_hours     Out_hours
 1     26         2016-11-23       8.5333      0.30

【问题讨论】:

请包含您想要的结果集 好的。感谢@AnkitAgrawal 的回复。我想要的结果是 in_hours 是 9 小时,然后是 o.30 小时 我在几个小时内完美,但在下班时间却出错了。它给出了从 24 小时开始的总小时数 总数签入和签出将只有 4 个?? 它可以超过 4 个。emp 可以像喝茶/咖啡一样休息更多,所以它会包含在下班时间。 【参考方案1】:

假设你的输入表叫Table1

Select device_id,
    Date(punch) As "Date",
    Sum(Case When stat_log = 'out' Then TimeStampDiff(minute, punch, next_punch) Else 0 End)/60 As out_hours,
    Sum(Case When stat_log = 'in' Then TimeStampDiff(minute, punch, next_punch) Else 0 End)/60 As in_hours
  From (
Select id, device_id, punch, stat_log, 
    (Select punch 
       From Table1 As n
       Where n.device_id = c.device_id
         And n.punch > c.punch
         And Date(n.punch) = Date(c.punch)
       Order By punch asc
       Limit 1) As next_punch
  From Table1 As c) As x
  Group By device_id, Date(punch);

编辑

在连接谓词中添加了And Date(n.punch) = Date(c.punch),以便它可以持续多天。

【讨论】:

请注意,我没有添加 id 字段,因为它似乎毫无意义。 '26', '2016-11-23', '0.5000', '8.5333' 完美 :-) 谢谢@mendosi 是的@kapil.dev 我想要的结果。 @MilanSoni 注意编辑!我的测试输入数据只涵盖了一天,所以我没想过要加入日期,否则一天结束的“出”将匹配第二天的第一个“入”。

以上是关于获取一天的总工作时间,总小时数,总小时数mysql [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 我不断获得总工作作为回报

MySQL 获取某个时间段每一天每一个小时的统计数据

从 Pandas Timedelta 获取总小时数?

Spotify API:获取歌曲播放次数、总小时数等

建设一个能承受500万PV/每天的网站如果计算?

js如何去当前时间前一天的时间和后一天