首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用mysql计算每天的工作时间

使用mysql计算每天的工作时间
EN

Stack Overflow用户
提问于 2020-06-04 12:32:10
回答 1查看 103关注 0票数 2

我想用MySQL计算每天的工作时间。我展示了许多小时的计算解决方案,但没有一个符合我的要求。在我的桌子上,我们的外场没有。我不得不把第一次入职看作是入职,第二次入职是出局,并据此计算工时。

表结构:

代码语言:javascript
运行
复制
CREATE TABLE IF NOT EXISTS `timesheet` (
  `MachineNo` int(6) unsigned NOT NULL,
  `Empcardno` int(3) unsigned NOT NULL,
  `Date` date  NOT NULL,
  `Time` time  NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `timesheet` 
(`MachineNo`, `Empcardno`, `Date`,`Time`) VALUES
    (01,    5,  '2020-05-22',   '18:15:54'),    
    (01,    5,  '2020-05-22',   '14:46:47'),
    (01,    5,  '2020-05-22',   '14:26:05'),
    (01,    5,  '2020-05-22',   '09:26:30'),
    (01,    5,  '2020-05-21',   '18:15:45'),
    (01,    5,  '2020-05-21',   '14:48:39'),
    (01,    5,  '2020-05-21',   '14:29:55'),
    (01,    5,  '2020-05-21',   '09:37:49');    

MySql fiddle link

我尝试了以下查询,但它只给出了max和min之间的总小时数。它不会考虑所有的输入输出值。我想考虑所有入点和出点之间的时间。

代码语言:javascript
运行
复制
SELECT
  Empcardno,min(Time),
  max(Time),
  TIMEDIFF(max(Time),
  min(Time)) As Diff_Value
FROM
  timesheet
GROUP BY
  DATE(Date),Empcardno

结果

代码语言:javascript
运行
复制
   Empcardno    Date       min(Time)    max(Time)   Diff_Value
    5         2020-05-21    09:37:49    18:15:45    08:37:56
    5         2020-05-22    09:26:30    18:15:54    08:49:24

但我想把时间算成这两者之间的时间

代码语言:javascript
运行
复制
 (01,    5,  '2020-05-21',   '14:29:55'),
 (01,    5,  '2020-05-21',   '09:37:49'); 

代码语言:javascript
运行
复制
(01,    5,  '2020-05-21',   '18:15:45'),
(01,    5,  '2020-05-21',   '14:48:39'),
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-04 14:21:06

这是一个在没有窗口函数的情况下很难解决的问题……基本上,您需要在每个日期为每台机器的每个条目生成行号。然后,您可以组合奇数行和偶数行以生成时间差,该时间差可以相加以生成一天的总时间。为此,我将奇数行上的时间转换为负数,这样当将该值添加到下一个值(来自偶数行)时,我们就可以得到两个值之间的差。

代码语言:javascript
运行
复制
SELECT MachineNo, Empcardno, Date, SEC_TO_TIME(SUM(tsecs)) AS total_time
FROM (
  SELECT CASE WHEN MachineNo = @mn AND Empcardno = @en AND `Date` = @dt
              THEN @rn := @rn + 1
              ELSE @rn := 1
         END AS rn,
         @mn := MachineNo AS MachineNo, @en := Empcardno AS Empcardno, 
         @dt := `Date` AS `Date`,
         CASE WHEN @rn % 2 = 1 THEN -TIME_TO_SEC(`Time`)
              ELSE TIME_TO_SEC(`Time`)
         END AS tsecs
  FROM timesheet
  CROSS JOIN (SELECT @mn := 0, @en := 0, @dt := '', @rn := 0) init
  ORDER BY Date, Time
) t
GROUP BY MachineNo, Empcardno, Date

输出:

代码语言:javascript
运行
复制
MachineNo   Empcardno   Date        total_time
1           5           2020-05-21  08:19:12
1           5           2020-05-22  08:28:42

Demo on SQLFiddle

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62186931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档