Я пытаюсь написать запрос, чтобы дать мне общее количество минут простоя за смену.У меня есть календарная таблица, в которой указаны время начала и окончания каждой смены за весь год.
Самыми большими трудностями, с которыми я столкнулся, является вычисление количества минут простоя в смену, когда время простоя распространяется на несколько смен.Другая проблема заключается в том, как рассчитать время простоя, когда оно все еще продолжается (нет остановки записи для последней начальной записи).
В базе данных 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 к его значению по умолчанию