Как получить посещаемость time_in и time_out с помощью кода mysql - PullRequest
2 голосов
/ 05 мая 2020

Примите во внимание следующее:

CREATE TABLE `raws_attendance` (
  `id` int(11) NOT NULL,
  `no_reg` varchar(128) NOT NULL,
  `date_time` datetime NOT NULL,
  `time` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `raws_attendance` (`id`, `no_reg`, `date_time`, `time`) VALUES
(13, '2019069', '2020-05-04 07:15:00', '07:15:00'),
(14, '2019069', '2020-05-04 21:15:00', '21:15:00'),
(15, '2019069', '2020-05-05 03:15:00', '03:15:00'),
(16, '2019069', '2020-05-05 04:15:00', '04:15:00'),
(17, '2019069', '2020-05-05 07:15:00', '07:15:00'),
(18, '2019069', '2020-05-05 21:15:00', '21:15:00'),
(19, '2019070', '2020-05-04 07:25:00', '07:25:00'),
(20, '2019070', '2020-05-04 21:25:00', '21:25:00'),
(21, '2019070', '2020-05-05 03:35:00', '03:35:00'),
(22, '2019070', '2020-05-05 04:25:00', '04:25:00'),
(23, '2019070', '2020-05-05 07:55:00', '07:55:00'),
(24, '2019070', '2020-05-05 21:55:00', '21:55:00');

Я хочу указать значение в time_in и time_out поле

В time_in у сотрудника был диапазон значений времени 06:15:00 AM до 11:59:00 AM и для time_out сотрудник имел диапазон значений времени 12:00:00 PM до 06:14:00 AM

Но я хочу, чтобы поле time_out стало двойным, так как первый диапазон - 12:00:00 PM до 11:59:00 PM а для второго диапазона - от 12:00:00 AM до 06:14:00 AM

Для условия, если у time_out было двойное время, оно будет выполнено с максимальным временем

Например, если сотрудник отсутствовал time_out в 09:00:00 PM, а затем сотрудник отсутствовал time_out снова вовремя 01:00:00 AM, поэтому для последнего time_out это 01:00:00 AM,

Но у меня была проблема, когда Я хочу поставить это условие. В результате время не смешивается с time_in, которое находится в этот день, а скорее создает новый день и составляет time_in и time_out, и это приводит к тому, что time_in в этот день становится нулевым значением.

Для запроса таблицы результатов:

|----------------------------------------------------------------------------------------|
|no_reg   | in_out  |  attendance_date      |        time_in        | time_out           |
|---------|---------|-----------------------|-----------------------|--------------------|
|2019069  | IN      | 04.05.2020 00:00:00   |  04.05.2020 07:15:00  | 04.05.2020 21:15:00|
|2019069  | OUT     |       NULL            |          NULL         | 05.05.2020 04:15:00|
|2019069  | IN      | 05.05.2020 00:00:00   |  05.05.2020 07:15:00  | 05.05.2020 21:15:00|
|2019070  | IN      | 04.05.2020 00:00:00   |  04.05.2020 07:25:00  | 04.05.2020 21:25:00|
|2019070  | OUT     |       NULL            |          NULL         | 05.05.2020 04:25:00|
|2019070  | IN      | 05.05.2020 00:00:00   |  05.05.2020 07:55:00  | 05.05.2020 21:55:00|
|---------|---------|-----------------------|-----------------------|--------------------|

Для запроса MYSQL:

SET @row_number = 0;
SET @no_reg = NULL;

SELECT 
   `no_reg`,
CASE
  WHEN `time` BETWEEN '06:15:00' AND '11:59:00' THEN "IN"
  WHEN `time` BETWEEN '12:00:00' AND '23:59:00' THEN "OUT"
  WHEN `time` BETWEEN '00:00:00' AND '06:14:00' THEN "OUT"
END in_out,
DATE(MAX(CASE WHEN  CASE
  WHEN `time` BETWEEN '06:15:00' AND '11:59:00' THEN "IN"
  WHEN `time` BETWEEN '12:00:00' AND '23:59:00' THEN "OUT"
  WHEN `time` BETWEEN '00:00:00' AND '06:14:00' THEN "OUT"
END = 'IN' THEN `date_time` END)) AS attendance_date,
MAX(CASE WHEN CASE
  WHEN `time` BETWEEN '06:15:00' AND '11:59:00' THEN "IN"
  WHEN `time` BETWEEN '12:00:00' AND '23:59:00' THEN "OUT"
  WHEN `time` BETWEEN '00:00:00' AND '06:14:00' THEN "OUT"
END = 'IN' THEN `date_time` END) AS time_in,
MAX(CASE WHEN CASE
  WHEN `time` BETWEEN '06:15:00' AND '11:59:00' THEN "IN"
  WHEN `time` BETWEEN '12:00:00' AND '23:59:00' THEN "OUT"
  WHEN `time` BETWEEN '00:00:00' AND '06:14:00' THEN "OUT"
END = 'OUT' THEN `date_time` END) AS time_out
FROM (
  SELECT *, 
     @row_number:=CASE WHEN @no_reg = `no_reg` THEN @row_number + 1 ELSE 0 END AS rn,
     TRUNCATE(@row_number / 2, 0) AS rn_rgp,
     @no_reg:=`no_reg`
  FROM raw_attendance
  ORDER BY no_reg, date_time
) t
GROUP BY t.`no_reg`, t.rn_rgp;

Надеюсь, все понимают, что я объяснил, я поместил ссылку на sql онлайн-редактор ниже:

Rextester SQL Online

1 Ответ

1 голос
/ 05 мая 2020

В качестве отправной точки действителен следующий промежуточный результат:

SELECT *
     , CASE WHEN time >= '06:15:00' AND time < '12:00:00' THEN 'in' ELSE 'out' END in_out 
  FROM raws_attendance;
+----+---------+---------------------+----------+--------+
| id | no_reg  | date_time           | time     | in_out |
+----+---------+---------------------+----------+--------+
| 13 | 2019069 | 2020-05-04 07:15:00 | 07:15:00 | in     |
| 14 | 2019069 | 2020-05-04 21:15:00 | 21:15:00 | out    |
| 15 | 2019069 | 2020-05-05 03:15:00 | 03:15:00 | out    |
| 16 | 2019069 | 2020-05-05 04:15:00 | 04:15:00 | out    |
| 17 | 2019069 | 2020-05-05 07:15:00 | 07:15:00 | in     |
| 18 | 2019069 | 2020-05-05 21:15:00 | 21:15:00 | out    |
| 19 | 2019070 | 2020-05-04 07:25:00 | 07:25:00 | in     |
| 20 | 2019070 | 2020-05-04 21:25:00 | 21:25:00 | out    |
| 21 | 2019070 | 2020-05-05 03:35:00 | 03:35:00 | out    |
| 22 | 2019070 | 2020-05-05 04:25:00 | 04:25:00 | out    |
| 23 | 2019070 | 2020-05-05 07:55:00 | 07:55:00 | in     |
| 24 | 2019070 | 2020-05-05 21:55:00 | 21:55:00 | out    |
+----+---------+---------------------+----------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...