我试图通过 id 获取每天的工作时间,该表有两列(id,registro):
id registro
1 2017-08-23 08:00:00 -starting working day
1 2017-08-23 12:00:00 -stop for lunching time
2 2017-08-23 12:40:00
1 2017-08-23 13:00:00 - return from lunching time
1 2017-08-23 17:00:00 - going home
然后我复制了这个想法:Get total hours worked in a day mysql为了创建一个列 in_out 并得到这个:
set @num := 0;
select tab.id, date_format(`registro`,'%d/%m/%Y') as date_,
SUM(UNIX_TIMESTAMP(`registro`)*(1-2*`in_out`))/3600 AS `hours_worked`
from (select id, registro, mod(@num := @num+1,2) as in_out from registro_ponto_v
where id= 1
and date_format(registro,"%d-%m-%Y") = '23-08-2017'
order by registro asc) as tab
group by tab.id, date_;
当我在 (mysql 14.14 dist 5.7.16 (x86_64) 上执行时,它正确地结果 8hs,但是当我在 debian 9 上的服务器版本 10.1 上执行时,由于某种原因,in_out 列在子选择中不显示相同的行顺序...(8 小时 - 1;12 小时 - 0;13 小时 -1;17 小时 -0) 因此小时的总和会得到不同的值。那么我的观点是:有一种方法可以保证行的顺序与此匹配:
id registro in_out
1 8hs 1
1 12hs 0
1 13hs 1
1 17hs 0
最佳答案
我认为如果您能够显式存储“ins”和“outs”,这会更简单......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL
, registro DATETIME NOT NULL
,status ENUM('in','out') NOT NULL
,PRIMARY KEY(id,registro)
);
INSERT INTO my_table VALUES
(1,'2017-08-23 08:00:00','in'),
(1,'2017-08-23 12:00:00','out'),
(2,'2017-08-23 12:40:00','in'),
(1,'2017-08-23 13:00:00','in'),
(1,'2017-08-23 17:00:00','out');
SELECT id
, DATE(user_in) date
, SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(user_out,user_in)))) total
FROM
( SELECT x.id,x.registro user_in,MIN(y.registro) user_out
FROM my_table x
JOIN my_table y
ON y.id = x.id
AND y.registro > x.registro
AND y.status = 'out'
WHERE x.status = 'in'
GROUP
BY x.id, x.registro
) a
GROUP
BY id,date;
+----+------------+----------+
| id | date | total |
+----+------------+----------+
| 1 | 2017-08-23 | 08:00:00 |
+----+------------+----------+
关于mysql - 如何保证mysql中的行以特定方式显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864766/