Доступность в рабочее время

Автор d.pimkin, 11 марта 2015, 02:13:04

« назад - далее »

d.pimkin

Доброго времени суток!

Похожую задачу я уже как-то озвучивал на форуме. Сейчас условие немного другое.
Имеется таблица событий следующего типа

time - начало события,
nexttime - конец события
diff - интервал в формате hh:mm:ss
start_dw -первый день недели рабочего времени
end_dw - последний день рабочего времни
start_time - начало раб.времени
end_time - конец раб. времени

Нужно посчитать разницу между time и nexttime в рабочее время.
Когда time и nexttime - один день, это легко, а вот если это разные дни? У меня даже идей нет...

admin

День добрый.
Что-то сразу не вникну, как понять (как считается) разница между time и nexttime в рабочее время?
Можно разъяснить на примере?

d.pimkin

Согласен, слово "доступность" вообще можно убрать.
Необходимо посчитать количество времени за интервал time-nexttime, которое пришлось на рабочее время хоста.
Например: time - 03.02.2015 02:17, nexttime - 06.02.2015 09:23; Рабочее время (график) хоста - Пн-Пт 03:00-16:00 (start_dw - 1, end_dw - 5, start_time 03:00, end_time - 16:00). Значит, мне нужно вычислить, сколько чч:мм из исходных 79:06 пришлось на Пн-Пт 03:00-16:00

admin

Что еще может потребоваться извлечь из сведений о состоянии триггеров анализируемой системы?
За какой диапазон дат будут анализироваться данные в приложении?

d.pimkin

Данные анализируются в скрипте, если что. Т.е. мне нужна в итоге таблица для последующего анализа.
Анализ за всю историю триггеров: сейчас глубина 3 месяца, а триггеров порядка 1к. В сумме это 600к записей. Но в будущем будет в 12 раз больше.

bibis

#5
Ну что-то вроде:
floor(NextTime-Time)* 9/24+
if(
if(time(end_time)<time(NextTime),time(end_time),time(NextTime))-
if(time(start_time)>time(time), time(start_time),time(time))
>0,
if(time(end_time)<time(NextTime),time(end_time),time(NextTime))-
if(time(start_time)>time(time), time(start_time),time(time))
)

d.pimkin

Честно говоря, не очень понял ваше решение.
Что такое floor(NextTime-Time)* 9/24 ?
И где же проверка на дни недели?

bibis

#7
Не проводил проверку на дни недели.
Тогда будет
networkdays(Time,NextTime)/3+
if(
if(time(end_time)<time(NextTime),time(end_time),time(NextTime))-
if(time(start_time)>time(time), time(start_time),time(time))
>0,
if(time(end_time)<time(NextTime),time(end_time),time(NextTime))-
if(time(start_time)>time(time), time(start_time),time(time))
)

networkdays(Time,NextTime)/3 это собственно  количество целых рабочих дней между началом и концом периода. На 3 делим т.к. раб день принимаем за 8 часов (в предыдущем варианте, принимал раб день за 9 часов, потому писал 9/24, тут сами смотрите, нужно ли учитывать обед )

admin

Добрый день.
Как успехи?
А прорабатывали вариант с использованием intervalmatch ?

bibis

Только сейчас кстати заметил, что раб день не нормирован.
Тогда меняем
networkdays(Time,NextTime)/3
на
networkdays(Time,NextTime)* (end_time-start_time)

d.pimkin

Спасибо за решения. Попробую сегодня этот способ.
На днях решил эту задачу средствами SQL, забыл отписать.

Яндекс.Метрика