[Oracle] tranches horaires

tranches horaires [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 20-07-2009 à 15:40:59    

Bonjour,
 
Je dispose d'une requete qui me donne une liste d'operation effectuées avec l'horodatage de ces operations.
Je souhaiterais presenter ces informations sous la forme de nombre d'operations par tranche horaire  
 
par exemple :
ma requete me renvoit :
Site; date; heure; nb_operations
Site1; 02/05/09; 15:59:00; 15
Site 2; 02/05/09;17:44:00;22
etc...
 
je souhaiterais presenter les donnees sous la forme d'un tableau croise :
Site;tranche1(15:30:00-15:59:59), tranche2(16:00:00-16:29:59);...
Site1;15;0;0;0;...
Site2;0;0;0;0;...;22;0;...
 
A priori, il semblerait qu'il faille utiliser un pivot, mais j'avoue que je ne vois pas bien comment gerer ca et surtout comment gerer les tranches horaires.
 
Merci d'avance pour toutes vos suggestions.
 
v.

Reply

Marsh Posté le 20-07-2009 à 15:40:59   

Reply

Marsh Posté le 20-07-2009 à 15:47:14    

Il y a un autre langage derrière, ou il te faut forcément du 100% SQL?


Message édité par skeye le 20-07-2009 à 15:47:44

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-07-2009 à 15:49:16    

he bien, je suis en train de chercher une solution pour le faire en 100% sql mais comme ca me gonfle, il ya des chances que je fasse cela en code.
 
J'avoue toutefois que je preferais une solution SQL.
 
v.

Reply

Marsh Posté le 20-07-2009 à 15:50:08    

Tu connais les tranches horaires à l'avance? Si oui tu as toujours la solution de la grosse union moche [:joce]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-07-2009 à 15:54:58    

les tranches horaires sont les heures de la journee d'exploitation decoupee par tranche de 10 minutes.
Idealement, je souhaiterais donc du 5h-21h, mais bien evidemment, je peux me contenter de la journee complete si ca semble plus simple.
 
v.

Reply

Marsh Posté le 20-07-2009 à 16:08:39    

vonm a écrit :

les tranches horaires sont les heures de la journee d'exploitation decoupee par tranche de 10 minutes.

 

Des tranches de 10 minutes ça doit pouvoir se faire ça par contre en bidouillant un peu... un truc du genre

 

select machin, truc, to_char(madate, 'HH24'), substr(to_char(madate, 'MI'), 0, 1), count(*)
from majolietable
group by machin, truc, to_char(madate, 'HH24'), substr(to_char(madate, 'MI'), 0, 1);

 

non?[:autobot]

Message cité 1 fois
Message édité par skeye le 20-07-2009 à 16:08:59

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 08-08-2009 à 20:41:48    

skeye a écrit :


 
Des tranches de 10 minutes ça doit pouvoir se faire ça par contre en bidouillant un peu... un truc du genre
 
select machin, truc, to_char(madate, 'HH24'), substr(to_char(madate, 'MI'), 0, 1), count(*)
from majolietable
group by machin, truc, to_char(madate, 'HH24'), substr(to_char(madate, 'MI'), 0, 1);
 
non?[:autobot]


'soir...
 
Je propose :  
 
select ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01', ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01' + 1/144, count(*)
from majolietable
group by ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01', ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01' + 1/144;
 
Mais ici, je ne peux pas tester... Donc à voir. En tout cas, je checkerai ça lundi au boulot, et je corrigerai au besoin...Pour le boulot, j'avais fait la même chose, donc sûr que ça fonctionne comme ça  :)

Reply

Marsh Posté le 10-08-2009 à 11:57:43    

john cleese a écrit :


'soir...

 

Je propose :

 

select ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01', ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01' + 1/144, count(*)
from majolietable
group by ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01', ceil((madate-date '-3000-01-01')*144)/144+date '-3000-01-01' + 1/144;

 

Mais ici, je ne peux pas tester... Donc à voir. En tout cas, je checkerai ça lundi au boulot, et je corrigerai au besoin...Pour le boulot, j'avais fait la même chose, donc sûr que ça fonctionne comme ça  :)


Alors, supposons que ta table (nommons-là FRANCOISE) soit de cette forme :
site (varchar2)
date_operation (date ou timestamp)
+ diffèrents champs concernant le détail de l'opération

 

==> ta requête pour obtenir le nb. d'opérations par tranche de 30 minutes serait de la forme :
select site,
       to_char(floor((date_operation-date '-3000-01-01')*48)/48+date '-3000-01-01','HH24:MI:SS') heure_debut,
       to_char(floor((date_operation-date '-3000-01-01')*48)/48+date '-3000-01-01' + 30/1440 - 1/86400,'HH24:MI:SS')   heure_fin,
       count (*)
from FRANCOISE
group by
       site,
       to_char(floor((date_operation-date '-3000-01-01')*48)/48+date '-3000-01-01','HH24:MI:SS'),
       to_char(floor((sysdate-date '-3000-01-01')*48)/48+date '-3000-01-01' + 30/1440 - 1/86400,'HH24:MI:SS');

 


Pour t'en assurer, essaie déjà ceci :
select
       to_char(floor((sysdate-date '-3000-01-01')*48)/48+date '-3000-01-01','HH24:MI:SS') ,
       to_char(floor((sysdate-date '-3000-01-01')*48)/48+date '-3000-01-01' + 30/1440 - 1/86400,'HH24:MI:SS')  
       from dual;


Message édité par john cleese le 26-06-2014 à 17:07:12
Reply

Marsh Posté le 27-02-2010 à 23:12:00    

Au fait...
 
De rien !!!

Reply

Marsh Posté le 09-03-2011 à 09:45:59    

Je n'avais pas vu la reponse.
 
Merci !
 
v.

Reply

Marsh Posté le 09-03-2011 à 09:45:59   

Reply

Marsh Posté le 27-09-2011 à 17:13:50    

Désolé de remonter le topic mais j'ai sensiblement le même problème en mySQL
 
Bonjour à tous,
 
je cherche à créer une requête qui sélectionne le nombre d’occurrences de trois activité sur une tranche horaire donnée, et ce sur une journée.
 
Basiquement, voilà comment je récupère les trois activités sur une seule tranche horaire :
 

Code :
  1. SELECT  COUNT(DATEHEURE_VAL_TEC) AS 'VAL_TEC_HORAIRE'
  2. FROM delaitraite
  3. WHERE CHAP='SANG_LOCAL' AND TIME(DATEHEURE_VAL_TEC) BETWEEN '00:00' AND '01:00'
  4. UNION
  5. SELECT  COUNT(DATEHEURE_VAL_BIO) AS 'VAL_BIO_HORAIRE'
  6. FROM delaitraite
  7. WHERE CHAP='SANG_LOCAL' AND TIME(DATEHEURE_VAL_BIO) BETWEEN '00:00' AND '01:00'
  8. UNION
  9. SELECT  COUNT(DATEHEURE_VAL_PVT) AS 'VAL_PVT_HORAIRE'
  10. FROM delaitraite
  11. WHERE CHAP='SANG_LOCAL' AND TIME(DATEHEURE_VAL_PVT) BETWEEN '00:00' AND '01:00'


 
Comme vous pouvez le voir, la requête va être énorme !
De plus, je vais devoir filtrer le tout, c'est à dire quelque chose comme ça :
 

Code :
  1. (
  2. (MES 3 ACTIVITÉS ENTRE 00h et 01h)
  3. UNION
  4. (MES 3 ACTIVITÉS ENTRE 01h et 02h)
  5. UNION
  6. ....
  7. (MES 3 ACTIVITÉS ENTRE 23h et 00h)
  8. )
  9. WHERE Option1=Blablabla AND Option2=Blablabla...etc


 
 
Auriez-vous une solution plus optimale ?

Reply

Marsh Posté le 27-09-2011 à 17:28:32    

Code :
  1. SELECT substring(TIME(DATEHEURE_VAL_TEC), 1, 2) AS 'heure', COUNT(DATEHEURE_VAL_TEC) AS 'VAL_TEC_HORAIRE'
  2. FROM delaitraite
  3. WHERE CHAP='SANG_LOCAL'
  4. GROUP BY substring(TIME(DATEHEURE_VAL_TEC), 1, 2)


:??:


Message édité par skeye le 27-09-2011 à 17:28:51

---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed