2010-05-06 2 views
2

J'ai quelques données avec les dates de début et de fin que j'ai besoin d'additionner. Je ne suis pas sûr de savoir comment coder pour cela.PL/SQL Somme par heure

Voici est les données que je dois utiliser:

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 

Dans cet exemple, je aurais besoin de la somme 13 heures-quatorze heures, 14 heures-15 heures et 15 heures-16 heures

Toutes les suggestions sont appréciés.

Steve

+1

La somme des 'eventcapacity' ? Et 13h-14h, ce qui signifie que - l'événement commence et se termine dans ce temps? Ou juste un chevauchement du tout? – tzaman

+0

Tout ce que tzaman a dit, plus le start_time et event_time ont-ils jamais duré une heure, par exemple 13:10 à 14:10? – APC

Répondre

3

Que diriez-vous quelque chose comme:

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

Merci beaucoup, je pensais que ce serait beaucoup plus difficile. Je vais devenir plus familier avec TRUNC, je n'ai jamais utilisé ça. – Steve

+0

Est-ce que cela tient compte des entrées qui couvrent plusieurs heures? (comme demandé par APC ci-dessus) – jmucchiello

+0

Plusieurs hypothèses ont été faites au sujet de la sortie désirée réelle, par exemple, j'ai supposé des sommes par heure par jour, heure de début, etc., mais l'idée était de faire passer le concept. – DCookie

0

Je ne suis pas sûr de la syntaxe exacte PL/SQL, mais quelque chose comme cela devrait le faire (même si il est assez unweildy):

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 
+0

unweildy pour le moins – David

1

Vous avez besoin d'une table de numéros:

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 

Une table de nombres a une seule colonne (valeur) et est rempli de valeurs entières de 0 à 100 (ou plus), bien que dans ce cas, il vous suffit de 0 à 23.

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