Получить время простоя, timestamp (алгоритм)

184
26 ноября 2017, 15:29

У нас есть общая система управления заказами, заказами управляют операторы, операторы могут приходить\уходить когда им захочется, наша задача это отследить время когда ни один из операторов не был онлайн, что мы имеем:

База данных с такими таблицами:

Operators('id', 'name' ...)
Operator_log('operator_id', 'status(1 = logged, 0 = logout)', 'time')

Operator_log имеет примерно такие записи:

 operator_id |   status   |     time
      1            1         1511541300
      2            1         1511541800
      1            0         1511545876
      5            1         1511581300
      2            0         1511591300
      5            0         1511841300
      4            1         1511941300
      4            0         1512541300

Из этих записей видно что простой был между

          5            0         1511841300  (3 с конца запись)

и

          4            1         1511941300  (2 с конца запись) 

В этот момент ни один из операторов не был онлайн

И вот вопрос, как получить этот простой программно?

Answer 1

Существует два типа отчётов: отчёт на дату и отчёт за период, у вас отчёт второго типа -- за период. В качестве входных данных вам поступит временной интервал "построить отчёт с 08:00:00 01.12.2017 по 18:00:00 01.12.2017".

Вот уже сразу на выход вашего отчёта можете передавать массив интервалов, когда никого не было: сразу первым же оператором записываете в $result первый элемент, содержащий весь период, который передали на вход.

Данные у вас находятся в виде "оператор - статус", но гораздо удобнее было бы обрабатывать данные в виде "оператор - дата начала смены - дата конца смены", например "Иванов был онлайн с 07:00:00 01.12.2017 по 08:15:00 01.12.2017", "Петров был онлайн с 17:00:00 01.12.2017 по 18:15:00 01.12.2017" и "Иванов был онлайн с 09:00:00 01.12.2017 по 09:15:00 01.12.2017".

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

Пересечения бывают двух видов: когда интервал активности оператора полностью находится внутри элемента (например, оператор был активен с 09:00 по 09:15) и нужно заменить в ответе один элемент (08:00 - 18:00) на два (08:00 - 09:00 и 09:15 - 18:00) или когда интервал активности убирает часть интервала.

Таких вариантов два:

  • убирает снизу (от интервала 08:00 - 09:00 убирая активность с 07:00 - 08:15 остаётся интервал 08:15 - 09:00);
  • убирает сверху (от интервала 09:15 - 18:00 убирая активность 17:00 - 18:15 остаётся 09:15 - 17:00).

Все условия тривиальны. Допустим, для случая когда у нас есть интервал (ts1_beg, ts1_end) и (ts2_beg, ts2_end) очевидно, что интервал 1 полностью содержится в интервале 2 при условии что ts1_beg > ts2_beg && ts1_end < ts2_end.

По окончании цикла вернуть $result.

В примере, который я приводил, итогом будет являться два периода простоя:

  • 08:15 - 09:00
  • 09:15 - 17:00
  • *
READ ALSO
PHP спарсить значения из кода по url

PHP спарсить значения из кода по url

Пытаюсь получить отдельные значения по ссылке wwwwowhead

187
Помогите с выводом комментариев ( дерево )

Помогите с выводом комментариев ( дерево )

Есть массив, первый параметр id, второй parent id и текст

142
Сэмулировать POST на другой сайт

Сэмулировать POST на другой сайт

При сабмите формы, данные отправляются по указанному урлу методом post

192
Как сократить отображаемое число в PHP?

Как сократить отображаемое число в PHP?

Допустим имею данное число: 3985Как мне её превратить в данную строку: 3,9К ?

174