У меня есть таблица, в которой хранится информация о сбоях некоторых устройств.Среди другой информации он содержит beginTime
и endTime
, которые представляют начало и конец отключения соответственно.
+----+---------------------+---------------------+-----+
| Id | beginTime | endTime | ... |
+----+---------------------+---------------------+-----+
| 10 | 13/01/2019 11:00:00 | 13/01/2019 15:00:00 | |
| 20 | 13/01/2019 20:00:00 | 14/01/2019 09:00:00 | |
| 30 | 13/01/2019 18:00:00 | 15/01/2019 10:00:00 | |
| 40 | 16/01/2019 22:00:00 | | |
+----+---------------------+---------------------+-----+
Я хочу подготовить отчет, чтобы показать сумму продолжительности отключений для каждого дня.Поскольку в таблице миллионы записей, я не хочу рассчитывать ее каждый раз, когда приложение загружает отчет, и вместо этого я хотел бы сохранить ее в базе данных.Я узнал о материализованных взглядах и подумал, что это будет хорошим инструментом для этой задачи.Я мог бы сделать это обновлять ежедневно в конце дня.Тем не менее, я изо всех сил пишу правильный SQL.Если предположить, что сегодня 17-01-2019, то желаемое содержимое просмотра будет таким:
+------------+------+
| date | time |
+------------+------+
| 13/01/2019 | 14 |4 hours from 1st + 4 hours from 2nd + 6 hours from 3rd
| 14/01/2019 | 33 |9 hours from 2nd + 24 hours from 3rd
| 15/01/2019 | 10 |10 hours from 3rd
| 16/01/2019 | 2 |2 hours from 4th
+------------+------+
Пока моя лучшая попытка -
select to_char(nvl(endTime, current_timestamp),'YYYY-MM-DD') as date,
sum(time_diff(beginTime, nvl(endTime, current_timestamp))) as time
from ttest
group by to_char(nvl(endTime, current_timestamp),'YYYY-MM-DD');
, где time_diff
- это вычисление разницы между временными метками,Это, очевидно, неправильно, поскольку оно основано на endTime
, но я застрял здесь, пока не знаю, куда идти.
Итак, возможно ли это?Или я должен использовать стандартную таблицу и немного PL / SQL для ее заполнения?На данный момент я еще не знаю, какие у меня есть варианты с учетом PL / SQL (например, ежедневный запуск).