Union d'intervalles de dates

Fermé
pierre0042 Messages postés 3 Date d'inscription lundi 26 novembre 2012 Statut Membre Dernière intervention 27 novembre 2012 - 26 nov. 2012 à 19:57
 pierre0042 - 3 déc. 2012 à 21:07
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

blux Messages postés 26556 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 29 décembre 2024 3 319
26 nov. 2012 à 21:46
Salut,

pas tout compris...
Tu peux donner un exemple ?
0
pierre0042 Messages postés 3 Date d'inscription lundi 26 novembre 2012 Statut Membre Dernière intervention 27 novembre 2012
26 nov. 2012 à 22:47
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
blux Messages postés 26556 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 29 décembre 2024 3 319
26 nov. 2012 à 22:51
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
pierre0042 Messages postés 3 Date d'inscription lundi 26 novembre 2012 Statut Membre Dernière intervention 27 novembre 2012
27 nov. 2012 à 12:16
L'équivalent s'appelle Transact-SQL, mais je ne suis pas sur qu'il suffise non plus...
0
blux Messages postés 26556 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 29 décembre 2024 3 319
27 nov. 2012 à 12:46
S'il est vraiment procédural, il devrait te permettre ce genre d'acrobaties...
0
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
ton exemple ne gère pas les cas où il y a un gap entre les intervalles...
0