Примите во внимание следующее:
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