PL/SQL 每小时总和

Posted

技术标签:

【中文标题】PL/SQL 每小时总和【英文标题】:PL/SQL Sum by hour 【发布时间】:2010-05-06 18:06:29 【问题描述】:

我有一些需要汇总的开始日期和结束日期的数据。我不知道如何编码。

这是我必须使用的数据:

STARTTIME,            STOPTIME,            EVENTCAPACITY
8/12/2009 1:15:00 PM, 8/12/2009 1:59:59 PM,     100

8/12/2009 2:00:00 PM, 8/12/2009 2:29:59 PM,     100

8/12/2009 2:30:00 PM, 8/12/2009 2:59:59 PM,      80

8/12/2009 3:00:00 PM, 8/12/2009 3:59:59 PM,      85

在这个例子中,我需要从下午 1 点到 2 点、2 点到 3 点和 3 点到 4 点的总和

欢迎提出任何建议。

史蒂夫

【问题讨论】:

eventcapacity 的总和?下午 1 点到 2 点意味着什么 - 活动在那个时间开始和结束?或者只是任何重叠? tzaman 所说的一切,加上 start_time 和 event_time 是否跨越一个小时,例如 13:10 到 14:10? 【参考方案1】:

怎么样:

SELECT TRUNC(stoptime,'HH'), sum(eventcapacity) 
  FROM yourtable
 GROUP BY TRUNC(stoptime,'HH');

【讨论】:

非常感谢,我认为这会更难。我会更加熟悉 TRUNC,我从来没有使用过。 这是否考虑了跨越多个小时的条目? (如上述 APC 所要求的) 对实际期望的输出做了几个假设,例如,我假设了按小时计算的总和、开始时间等,但我的想法是让概念得到理解。 不客气。我有时认为,了解 Oracle 日期处理的所有细微差别可以成为职业;-)【参考方案2】:

你需要一个数字表:

select sum(e.capacity), n.value from eventtable e
left outer join numbers n on n.value between
    extract(hours from e.starttime) and extract(hours from e.stoptime)
where n.value between 0 and 23
group by n.value
order by n.value

数字表只有一列(值),并填充了从 0 到 100(或更多)的整数值,尽管在这种情况下您只需要 0 到 23。

create table number (
    value number(4) not null,
    primary key (value)
);

【讨论】:

【参考方案3】:

我不确定确切的 PL/SQL 语法,但应该这样做(虽然它很笨拙):

select sum(capacity), case when to_char(starttime, 'HH') between '13' and '14'
                            and to_char(stoptime, 'HH') between '13' and '14'
                            then '1pm-2pm'
                      case when to_char(starttime, 'HH') between '14' and '15'
                            and to_char(stoptime, 'HH') between '14' and '15'
                            then '2pm-3pm'
                      (etc.) 
                      as timeslot
from eventtable
group by timeslot

【讨论】:

以上是关于PL/SQL 每小时总和的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 过程中的排序表失败

Oracle_PL/SQL(10) 定时器job

PL/Sql 函数

pl/sql:函数

PL/SQL 异常处理

仅更新 Pl/SQL 中日期时间字段的日期