3 回答
TA贡献1906条经验 获得超3个赞
DROP TABLE IF EXISTS staff1;
CREATE TABLE staff1
(id SERIAL PRIMARY KEY
,login_id INT NOT NULL
,checkin TIME NOT NULL
);
INSERT INTO staff1 VALUES
(1,1,'15:08:20'),
(2,1,'15:10:56'),
(3,1,'16:49:06');
DROP TABLE IF EXISTS staff1out;
CREATE TABLE staff1out
(id SERIAL PRIMARY KEY
,login_id INT NOT NULL
,checkout TIME NOT NULL
);
INSERT INTO staff1out VALUES
(1,1,'15:10:41'),
(2,1,'15:11:14'),
(3,1,'16:54:09');
SELECT x.*
, MIN(y.checkout) checkout
, TIMEDIFF(MIN(y.checkout),x.checkin) delta
FROM staff1 x
LEFT
JOIN staff1out y
ON y.login_id = x.login_id
AND y.checkout > x.checkin
GROUP
BY x.id;
+----+----------+----------+----------+----------+
| id | login_id | checkin | checkout | delta |
+----+----------+----------+----------+----------+
| 1 | 1 | 15:08:20 | 15:10:41 | 00:02:21 |
| 2 | 1 | 15:10:56 | 15:11:14 | 00:00:18 |
| 3 | 1 | 16:49:06 | 16:54:09 | 00:05:03 |
+----+----------+----------+----------+----------+
在 PHP 中计算总时间可能是最简单的,但如果你想在 MySQL 中计算,可能看起来像这样......
SELECT login_id
, SEC_TO_TIME(SUM(TIME_TO_SEC(delta))) total
FROM
(
SELECT x.*
, MIN(y.checkout) checkout
, TIMEDIFF(MIN(y.checkout),x.checkin) delta
FROM staff1 x
LEFT
JOIN staff1out y
ON y.login_id = x.login_id
AND y.checkout > x.checkin
GROUP
BY x.id
) a
GROUP
BY login_id;
+----------+----------+
| login_id | total |
+----------+----------+
| 1 | 00:07:42 |
+----------+----------+
TA贡献1811条经验 获得超4个赞
尝试使用此查询。
SELECT *,timediff(checkout,checkin)hour FROM (
(SELECT s.login_id,s.checkin from staff1 as s)as g,
(SELECT b.checkout from staff2 as b) as e
)group by login_id
TA贡献2041条经验 获得超4个赞
我更喜欢这个:
SELECT staff1.login_id
, staff1.checkin
, staff2.checkout
, ROUND(TIMESTAMPDIFF(MINUTE, staff1.checkin, staff2.checkout)/60, 2) as hours
FROM staff1
LEFT
JOIN staff2
ON staff1.login_id = staff2.login_id
使用此查询,如果用户只签入但未签出,您也会得到一行。
- 3 回答
- 0 关注
- 169 浏览
添加回答
举报
