Union d'intervalles de dates

pierre0042 Messages postés 3 Statut Membre -  
 pierre0042 -
Bonjour,

J'ai une table avec (en gros) 3 champs : un Id, un champ DateDebut et un champ DateFin.

ça me fait donc une liste d'intervalles de dates différents.

comment puis-je faire pour obtenir l'union ou l'intersection de ces intervalles (ou d'une partie) en SQL ?

je ne trouve rien dans les fonctions de dates qui gère ça.

(j'utilise SQL Server 2008).

Merci d'avance,

3 réponses

  1. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    pas tout compris...
    Tu peux donner un exemple ?
    0
  2. pierre0042 Messages postés 3 Statut Membre
     
    Oui bien sur.

    Prenons comme données (id, date1, date2) :

    1, 03/05/2005, 12/11/2005
    2, 04/08/2005, 02/05/2006
    3, 23/04/2006, 30/03/2007
    4, 24/07/2007, 17/02/2008
    5, 23/06/2008, 31/12/2008

    l'union pour id <= 3 donne 03/05/2005, 30/03/2007
    l'union pour id in (3, 4) donne 23/04/2006, 30/03/2007 et 24/07/2007, 17/02/2008

    l'intersection pour id <= 2 donne 04/08/2005, 12/11/2005
    l'intersection pour id >= 3 donne NULL
    0
    1. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Ah ben là, le SQL simple ne suffira pas...
      Il faudra sûrement passer par du PL/SQL (ou son équivalent en SQL Server).
      0
    2. pierre0042 Messages postés 3 Statut Membre
       
      L'équivalent s'appelle Transact-SQL, mais je ne suis pas sur qu'il suffise non plus...
      0
    3. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      S'il est vraiment procédural, il devrait te permettre ce genre d'acrobaties...
      0
  3. A.Nonymous
     
    SELECT  
     MIN(limite_basse.date1) AS minDT, MAX(limite_haute.date2) AS maxDT  
    FROM intervalle AS limite_basse 
    INNER JOIN intervalle AS limite_haute ON limite_basse.date2 BETWEEN limite_haute.date1 AND limite_haute.date2 WHERE limite_basse.id IN (3,4) AND  limite_haute.id IN (3,4);


    Et pour l'utiliser dans un autre SQL :
    SELECT * FROM (SELECT  
     MIN(limite_basse.date1) AS minDT, MAX(limite_haute.date2) AS maxDT  
    FROM intervalle AS limite_basse 
    INNER JOIN intervalle AS limite_haute ON limite_basse.date2 BETWEEN limite_haute.date1 AND limite_haute.date2 WHERE limite_basse.id IN (3,4) AND  limite_haute.id IN (3,4)) intervalle  
    INNER JOIN evenement ON evenement.dt BETWEEN intervalle.minDT AND intervalle.maxDT - INTERVAL 1 SECOND;
    0
    1. pierre0042
       
      ton exemple ne gère pas les cas où il y a un gap entre les intervalles...
      0