Вывод из Mysql табеля рабочего времени в таблицу

R.Titovich

Новичок
Здравствуйте, форумчане.
Встала задача сформировать для просмотра таблицу учета рабочего времени.
В бд данные хранятся в виде: id, name (фио сотрудника), act (вход/выход), datatime (время и дата посещения).
Каждое новое посещение добавляется отдельной строкой.
Подскажите как сформировать структуру таблицы и запрос в sql для вывода этого сего, где Р - рабочий день, так как дата и фио имеются в бд, В - выходной
ФИО/Дата123...
Иванов И. И.РВР...
Сидоров А. А.ВРР...
 

ksnk

прохожий
Вы проектировали БД?
В бд данные хранятся в виде: id, name (фио сотрудника), act (вход/выход), datatime (время и дата посещения).
Это похоже на данные с вахты - ключи доступа на вход-выход сами заносятся в базу.

Тонкость в том, что считать рабочим днем. Например 9 часов суммарно от входа-выхода -это рабочий день, или рабочий день с переработкой? А 7 часов - это полный рабочий день или не считать? Если народ в командировке-удаленно и не отмечен в базе - это учитывается отдельным образом?

Что делать, если вход в один день, а выход в другой? Ночная смена, выход через окно, сбой датчика на вахте...

Особый ужас будет, если у нас однофамильцы. :)
 

R.Titovich

Новичок
Это похоже на данные с вахты - ключи доступа на вход-выход сами заносятся в базу.

Тонкость в том, что считать рабочим днем. Например 9 часов суммарно от входа-выхода -это рабочий день, или рабочий день с переработкой? А 7 часов - это полный рабочий день или не считать? Если народ в командировке-удаленно и не отмечен в базе - это учитывается отдельным образом?

Что делать, если вход в один день, а выход в другой? Ночная смена, выход через окно, сбой датчика на вахте...

Особый ужас будет, если у нас однофамильцы. :)
База сформирована СКУДОМ и данные заносятся в нее из скуда по крону.
Тут важно не считать количество часов отработанных в определенный день определенным сотрудником, важно проставить ему в таблице Р (рабочий день).
По крайней мере так в ТЗ заказчик хочет) а как он вышел, через окно или вахтер на вахте уснул это исключительно проблема вахтера)
 

antonio

Moderator
Команда форума
Есть ли доступ к таблице сотрудников где id, name? Чтобы не плодить костыли нужно иметь две таблицы.
1. Таблица сотрудников
2. Таблица учета приходов - уходов
Связь между ними по id сотрудника.
 

R.Titovich

Новичок
Есть ли доступ к таблице сотрудников где id, name? Чтобы не плодить костыли нужно иметь две таблицы.
1. Таблица сотрудников
2. Таблица учета приходов - уходов
Связь между ними по id сотрудника.
Есть отдельная таблица с сотрудниками
Есть вторая таблица с приходом-уходом
 

ksnk

прохожий
Если продолжительность рабочего дня не интересна, то нужно считать только и исключительно входы сотрудников. Время входа округляется до даты, по ним делается distinct.
Пусть будет база scud - {id: int, user: string, inout:1/0, visit:datetime}, где user гарантированно уникальный для уникального юзера, чтобы у меня внутри ничего дыбом не вставало.
Запрос для вывода таблицы на месяц -
SQL:
select * from (select distinct user, DATE_FORMAT (visit ,'%d') as d, DATE_FORMAT (visit ,'%Y-%m') as my, `inout` from scud) x
where x.inout=1 and x.my='2023-03'
Дальше из этой таблицы средствами php сочиняем табель.
 
Последнее редактирование:

R.Titovich

Новичок
Если продолжительность рабочего дня не интересна, то нужно считать только и исключительно входы сотрудников. Время входа округляется до даты, по ним делается distinct.
Пусть будет база scud - {id: int, user: string, inout:1/0, visit:datetime}, где user гарантированно уникальный для уникального юзера, чтобы у меня внутри ничего дыбом не вставало.
Запрос для вывода таблицы на месяц -
SQL:
select * from (select distinct user, DATE_FORMAT (visit ,'%d') as d, DATE_FORMAT (visit ,'%Y-%m') as my, `inout` from scud) x
where x.inout=1 and x.my='2023-03'
Дальше из этой таблицы средствами php сочиняем табель.
Благодарю, очень понравился запрос к бд, помог в решении головной боли)
 

ksnk

прохожий
Тут DISTINCT не нужен, достаточно GROUP BY.
Эээ. К примеру, юзер в один из дней раз в час в течении рабочего дня входит и выходит через вахту. distinct в этом случае из всего этого праздника жизни оставит одну запись о начале юзером рабочего дня. А что в этом случае сделает groupby по юзеру ? Какую групповую функцию нужно использовать?

Чтобы не быть совсем уж телепатами - вот ссылка на фидл
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
group by по пользователю и дате, но на самом деле это не обязательно, они же не хотят время считать. если бы вместо Р нужно было сумму часов показать, то да.
SQL:
select distinct user, DATE_FORMAT (visit ,'%d') as d 
from scud 
where inout=1 and visit like '2023-03%'
 
Последнее редактирование:
Сверху