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 每小时总和的主要内容,如果未能解决你的问题,请参考以下文章