Requete SQL assez complexe

Karamurat Messages postés 45 Statut Membre -  
Karamurat Messages postés 45 Statut Membre -
Bonjour à tous !

Je galère un peu sur une requête SQL, pour commencer je ne sais même pas si elle est réalisable, mais je me lance quand même ^^.

J'ai une table 'prévision' qui est représenté comme ceci :

http://img821.imageshack.us/img821/719/phpmyadmine.jpg

Ici pour faire simple je vais m'occuper que de ma table prévision .

Je voudrais mettre en place une requête qui me récupère la prévision en affichant les jours entre chaque intervalle prev_datedeb et prev_datefin c'est-à-dire comme ceci :

1;2010-12-14;2010-12-13 08:57:52;28:65000:4:5
1;2010-12-15;2010-12-13 08:57:52;28:65000:4:5
1;2010-12-16;...
1;2010-12-17;...
1;2010-12-18;...

Je n'ai donc aucune idée de comment m'y prendre, d'ailleurs comme dit plus haut je ne suis même pas sûr que ce soit réalisable. :(

Je remercie d'avance celle ou ceux qui peuvent me venir en aide.

2 réponses

Karamurat Messages postés 45 Statut Membre 2
 
Je viens de résoudre mon problème grâce à la doc sur la gestion du temps :https://sqlpro.developpez.com/cours/gestiontemps/ qui m'a beaucoup aidé.

j'ai créé une Procedure afin de générer le calendrier, que je l'appelle ainsi :

call make_intervals('2010-01-01 00:00:00','2035-12-31 00:00:00',1,'DAY')

CREATE PROCEDURE make_intervals(startdate timestamp, enddate timestamp, intval integer, unitval varchar(10))
BEGIN
-- *************************************************************************
-- Procedure: make_intervals()
*************************************************************************
   declare thisDate timestamp;
   declare nextDate timestamp;
   set thisDate = startdate;

   -- *************************************************************************
   -- Drop / create the table
*************************************************************************
   drop table if exists time_intervals;
   create table if not exists time_intervals
      (
      interval_start timestamp,
      interval_end timestamp
      );

   -- *************************************************************************
   --Boucle
*************************************************************************
   repeat
      select
         case unitval
            when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
            when 'SECOND'      then timestampadd(SECOND, intval, thisDate)
            when 'MINUTE'      then timestampadd(MINUTE, intval, thisDate)
            when 'HOUR'        then timestampadd(HOUR, intval, thisDate)
            when 'DAY'         then timestampadd(DAY, intval, thisDate)
            when 'WEEK'        then timestampadd(WEEK, intval, thisDate)
            when 'MONTH'       then timestampadd(MONTH, intval, thisDate)
            when 'QUARTER'     then timestampadd(QUARTER, intval, thisDate)
            when 'YEAR'        then timestampadd(YEAR, intval, thisDate)
         end into nextDate;

      insert into time_intervals select thisDate, timestampadd(MICROSECOND, -1, nextDate);
      set thisDate = nextDate;
   until thisDate >= enddate
   end repeat;

 END;


grace à ça j'ai généré un calendrier jusqu'en 2035 :mouarf:

que j'ai ensuite comparée par rapport à ma table prévision des prev_datedeb et prev_datefin.

j'ai donc pu ressortir tous les jours entre.
1
scriptiz Messages postés 1494 Statut Membre 425
 
Il me semble que pour ça tu ne va pas pouvoir tout faire tenir en une seule requête SQL.

L'idéal serait d'utiliser par exemple une fonction en PL(PG)/SQL (selon ton SGDB) qui retournerait un SETOF RECORDS que tu créerait toi même en ajoutant à chaque fois une interval de 1 après la date de départ et ceci jusqu'à la date de fin.

Sinon tu peux aussi via ta couche logicielle (imaginons que ce soit en Java ou en PHP) faire ce traitement et réaliser un affichage adéquat.

Bonne chance.
0