我想用MySQL计算每天的工作时间。我展示了许多小时的计算解决方案,但没有一个符合我的要求。在我的桌子上,我们的外场没有。我不得不把第一次入职看作是入职,第二次入职是出局,并据此计算工时。
表结构:
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');
我尝试了以下查询,但它只给出了max和min之间的总小时数。它不会考虑所有的输入输出值。我想考虑所有入点和出点之间的时间。
SELECT
Empcardno,min(Time),
max(Time),
TIMEDIFF(max(Time),
min(Time)) As Diff_Value
FROM
timesheet
GROUP BY
DATE(Date),Empcardno
结果
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
但我想把时间算成这两者之间的时间
(01, 5, '2020-05-21', '14:29:55'),
(01, 5, '2020-05-21', '09:37:49');
和
(01, 5, '2020-05-21', '18:15:45'),
(01, 5, '2020-05-21', '14:48:39'),
发布于 2020-06-04 14:21:06
这是一个在没有窗口函数的情况下很难解决的问题……基本上,您需要在每个日期为每台机器的每个条目生成行号。然后,您可以组合奇数行和偶数行以生成时间差,该时间差可以相加以生成一天的总时间。为此,我将奇数行上的时间转换为负数,这样当将该值添加到下一个值(来自偶数行)时,我们就可以得到两个值之间的差。
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
输出:
MachineNo Empcardno Date total_time
1 5 2020-05-21 08:19:12
1 5 2020-05-22 08:28:42
https://stackoverflow.com/questions/62186931
复制相似问题