【发布时间】:2019-06-23 20:15:54
【问题描述】:
我有一张表,用于存储有关某些设备的中断信息。在其他信息中,它包含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 有哪些选择(比如每天触发它)。
【问题讨论】:
标签: oracle plsql materialized-views