Requete SQL assez complexe

Fermé
Karamurat Messages postés 43 Date d'inscription jeudi 12 juillet 2007 Statut Membre Dernière intervention 4 janvier 2011 - 4 janv. 2011 à 11:55
Karamurat Messages postés 43 Date d'inscription jeudi 12 juillet 2007 Statut Membre Dernière intervention 4 janvier 2011 - 4 janv. 2011 à 15:52
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 43 Date d'inscription jeudi 12 juillet 2007 Statut Membre Dernière intervention 4 janvier 2011 2
4 janv. 2011 à 15:52
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 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
4 janv. 2011 à 15:50
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