Определение периодов работы сотрудников по данным СКУД. Сгруппировать периоды в запросе

FastCode 1530 12 22 67

В задаче требовалось по данным записи событий входа и выхода на разных дверях предприятия определить периоды работы сотрудника. Дополнительно считается, что если человек в течении 6 часов отсутсвует на территории - то он ушел домой и данный рабочий "день" для него закончен.

В задаче требовалось по данным записи событий входа и выхода на разных дверях предприятия определить периоды работы сотрудника. Дополнительно считается, что если человек в течении 6 часов отсутствует на территории - то он ушел домой и данный рабочий "день" для него закончен.

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(ПроходыСигур.Период, СЕКУНДА, РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ПроходыСигур.Время, СЕКУНДА)) КАК Дата,
    ПроходыСигур.Сотрудник
ПОМЕСТИТЬ Дано
ИЗ
    ПроходыСигур КАК ПроходыСигур
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(Раньше.Дата) КАК От,
    Дано.Дата КАК До,
    Дано.Сотрудник
ПОМЕСТИТЬ Отсутствия
ИЗ
    Дано КАК Раньше
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Дано
        ПО Раньше.Сотрудник = Дано.Сотрудник
            И Раньше.Дата < Дано.Дата

СГРУППИРОВАТЬ ПО
    Дано.Сотрудник,
    Дано.Дата

ИМЕЮЩИЕ
    РАЗНОСТЬДАТ(МАКСИМУМ(Раньше.Дата), Дано.Дата, ЧАС) > 6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    &ДатаНачала,
    &ДатаНачала,
    ПроходыСигур.Сотрудник
ИЗ
    ПроходыСигур КАК ПроходыСигур

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    &ДатаОкончания,
    &ДатаОкончания,
    ПроходыСигур.Сотрудник
ИЗ
    ПроходыСигур КАК ПроходыСигур
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(Раньше.До) КАК От,
    Отсутствия.От КАК До,
    Отсутствия.Сотрудник
ИЗ
    Отсутствия КАК Отсутствия
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Отсутствия КАК Раньше
        ПО Отсутствия.Сотрудник = Раньше.Сотрудник И Раньше.До < Отсутствия.От  

СГРУППИРОВАТЬ ПО
    Отсутствия.От,
    Отсутствия.Сотрудник

Эта задача тоже относится к классу "Islands and Gaps". В запросе сначала определяются все отсутствия сотрудника, а затем периоды между отсутствиями считаются периодами работы.
Отсутствиями считаются все периоды неактивности длиннее шести часов.

То есть предлагается вообще отказаться от анализа типов событий: вход, выход, так как непонятно внешние ли это двери и всегда ли срабатывает регистрация. Любое событие считается активностью. Время соединяется с датой. Это важно для круглосуточности.

Если все же двери строго внешние и жалко терять информацию о типе события, то "математически" правильно будет разделять последовательные вход-вход или выход-выход противоположным событием, расположенным строго посередине интервала равновероятности времени. В среднем это будет сводить к минимуму ошибку домысливания пропущенного при регистрации события.

Автор: ildarovich

0
Орфографическая ошибка в отсутсвует: отсутсвует
Орфографическая ошибка в ПроходыСигур (найдено 11): Сигур
Орфографическая ошибка в неактивности: неактивности
Орфографическая ошибка в круглосуточности: круглосуточности
Орфографическая ошибка в равновероятности: равновероятности
Орфографическая ошибка в домысливания: домысливания

См. также

Срез на даты за период. Шаблон запроса

ШаблонТекстаЗапросаОпределенияБлижайшихДатПоГрафикуРаботы (БСП)

Кадровые данные сотрудника

Нахождение интервалов в запросе

Получить даты за период в запросе

ПодключитьТестовыйПериод (БСП)

ПодключениеТестовыхПериодов_ПроверитьСостояниеЗапроса (БСП)

Инвертирование периодов в запросе

РасписанияРаботыНаПериод (БСП)

Модератору