Вы можете использовать коррелированные подзапросы для получения пар входа / выхода:
SELECT employee, ac_date AS entry_date,
(SELECT ac_date
FROM AC AS i
WHERE i.ac_event = 0
AND i.employee = t.employee
AND i.ac_date >= t.ac_date
AND i.ac_time >= t.ac_time
ORDER BY i.ac_date, i.ac_time LIMIT 1) AS exit_date,
ac_time AS entry_time,
(SELECT ac_time
FROM AC AS i
WHERE i.ac_event = 0
AND i.employee = t.employee
AND i.ac_date >= t.ac_date
AND i.ac_time >= t.ac_time
ORDER BY i.ac_date, i.ac_time LIMIT 1) AS exit_time
FROM AC AS t
WHERE t.ac_date BETWEEN '2018-05-12' AND '2018-05-13' AND t.ac_event = 1;
Выход:
employee entry_date exit_date entry_time exit_time
-------------------------------------------------------
2032 2018-05-12 2018-05-12 08:52:00 11:39:33
2032 2018-05-12 2018-05-12 11:48:06 11:52:54
2032 2018-05-12 2018-05-12 11:59:54 12:23:40
2032 2018-05-13 2018-05-13 08:34:43 09:02:25
2032 2018-05-13 2018-05-13 09:12:16 11:45:21
2032 2018-05-13 2018-05-13 12:50:40 12:52:16
Затем вы можете использовать TIMESTAMPDIFF для расчета времени между каждой записью - выход:
SELECT employee, entry_date, exit_date, entry_time, exit_time,
SEC_TO_TIME(TIMESTAMPDIFF(SECOND,
CONCAT(entry_date, ' ', entry_time),
CONCAT(exit_date, ' ', exit_time))) AS duration
FROM (
SELECT employee, ac_date AS entry_date,
(SELECT ac_date
FROM AC AS i
WHERE i.ac_event = 0
AND i.employee = t.employee
AND i.ac_date >= t.ac_date
AND i.ac_time >= t.ac_time
ORDER BY i.ac_date, i.ac_time LIMIT 1) AS exit_date,
ac_time AS entry_time,
(SELECT ac_time
FROM AC AS i
WHERE i.ac_event = 0
AND i.employee = t.employee
AND i.ac_date >= t.ac_date
AND i.ac_time >= t.ac_time
ORDER BY i.ac_date, i.ac_time LIMIT 1) AS exit_time
FROM AC AS t
WHERE t.ac_date BETWEEN '2018-05-12' AND '2018-05-13' AND t.ac_event = 1) AS x
Демо здесь