Рассчитать общее время простоя на основе времени смены
Я пытаюсь написать запрос, чтобы дать мне общее количество минут простоя за смену. У меня есть таблица календаря, в которой указаны время начала и окончания каждой смены на весь год.
Самые большие трудности, с которыми я сталкиваюсь, это как рассчитать количество минут простоя в смену, когда время простоя распределяется по нескольким сменам. Другая проблема заключается в том, как рассчитать время простоя, когда оно все еще продолжается (нет остановки записи для последней записи запуска).
В базе данных Postgres время простоя записывается путем перечисления идентификатора компьютера, который его создал, отметки времени создания и какого события (время начала или время остановки).
pue_produnit_id pue_tcreation pue_eventkind
17 2018-12-13 04:45:07 StartDownTime
17 2018-12-14 10:36:35 StopDownTime
18 2018-12-14 10:40:11 StartDownTime
18 2019-01-04 10:46:34 StopDownTime
В календарной таблице смены это записывается путем указания идентификатора типа смены (1, 2, 3), начала смены и конца смены.
cae_entrytype_id cae_from cae_to
1 2019-01-01 06:30:00 2019-01-01 14:30:00
2 2019-01-01 14:30:00 2019-01-01 22:30:00
3 2019-01-01 22:30:00 2019-01-02 06:30:00
Я был в состоянии написать запрос, чтобы показать мне это, используя привести, чтобы найти время простоя остановки и используя между, чтобы сравнить метку времени простоя с календарем смены:
Date Shift_number Machine ActivityDate startdttime stopdttime Duration_Minutes
2019-02-05 1 17 2019-02-05 2019-02-05 14:19:39 2019-02-05 14:23:46 4
То, что у меня есть, не обязательно то, что мне нужно. Номер смены берется из того, когда наступило время запуска, и не делит его, когда время останова находится в другой смене. Мне бы хотелось, чтобы из таблицы календаря смен для одной записи было видно, сколько минут было простоев. Это нужно будет сделать для каждой машины. Например:
Machine Shift Date downtime_minutes
17 1 1/2/2019 26
18 1 1/2/2019 32
17 2 1/2/2019 0
18 2 1/2/2019 100
Если вычислить время простоя, которое все еще происходит (без последней записи времени останова), то это нормально на данный момент. Также, в зависимости от результатов, я смогу решить это с помощью ведущей функции и добавив current_timestamp к его значению по умолчанию.