IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

'fussion' d'enregistrement et comparaison de date


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 'fussion' d'enregistrement et comparaison de date
    Voici une question qui semble trop simple !!


    Contexte :
    Obtenir à partir d'une table de crenaux (DateDebut , DateFin) la liste des créneaux fusionés
    Bien entendu, je ne connais pas par avance le nombre d'enregistrement se chevauchant


    Exemple :
    ___Debut____________Fin_________
    01/01/2005 02:00 | 01/01/2005 03:00
    01/01/2005 02:30 | 01/01/2005 04:00
    01/01/2005 06:00 | 01/01/2005 08:00
    01/01/2005 06:30 | 01/01/2005 07:30
    01/01/2005 07:30 | 01/01/2005 08:30

    Resultat :
    ___Debut____________Fin_________
    01/01/2005 02:00 | 01/01/2005 04:00
    01/01/2005 06:00 | 01/01/2005 08:30


    Et cerise sur le gateaux obtenir le négatif
    Soit :
    01/01/2005 00:00 | 01/01/2005 02:00
    01/01/2005 04:00 | 01/01/2005 06:00
    01/01/2005 08:30 | 01/01/2005 24:00


    Le tous devra être ORACLE 9 complient mais toutes les idées/solutions seront les bienvenues


    Merci d'avance



    Le script ORACLE :
    create table RdV(debut date, fin date);

    insert into RdV values (to_date('01/01/2005 02:00', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 03:00', 'dd/mm/yyyy hh24:mi'));
    insert into RdV values (to_date('01/01/2005 02:30', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 04:00', 'dd/mm/yyyy hh24:mi'));
    insert into RdV values (to_date('01/01/2005 06:00', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 08:00', 'dd/mm/yyyy hh24:mi'));
    insert into RdV values (to_date('01/01/2005 06:30', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 07:30', 'dd/mm/yyyy hh24:mi'));

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Il faut vraiment beaucoup tester ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Min(debut), Max(fin)
    FROM (SELECT debut, fin, Decode(LEVEL, 1, ROWNUM, ROWNUM+1 -level) AS Groupe
          FROM dvp_rdv a
          CONNECT BY debut < PRIOR fin AND fin > PRIOR fin AND ROWID != PRIOR ROWID
          START WITH NOT EXISTS (SELECT NULL 
                                 FROM dvp_rdv b 
                                 WHERE a.debut BETWEEN b.debut AND b.fin 
                                   AND a.ROWID != b.rowid))
    GROUP BY Groupe
    Je n'ai pas eu de problème avec le jeu d'essai suivant, mais je ne garantis vraiment rien.

    Le problème peut provenir de la façon de constituer le GROUP BY, il est possible de garantir cette partie en utilisant sys_connect_by_path, si tu es en version 8i (non officiel) ou 9i (officiel).

    insert into dvp_RdV values (to_date('01/01/2005 02:00', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 03:00', 'dd/mm/yyyy hh24:mi'));
    insert into dvp_RdV values (to_date('01/01/2005 02:30', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 04:00', 'dd/mm/yyyy hh24:mi'));
    insert into dvp_RdV values (to_date('01/01/2005 04:30', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 05:00', 'dd/mm/yyyy hh24:mi'));
    insert into dvp_RdV values (to_date('01/01/2005 03:30', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 04:15', 'dd/mm/yyyy hh24:mi'));
    insert into dvp_RdV values (to_date('01/01/2005 06:00', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 08:00', 'dd/mm/yyyy hh24:mi'));
    insert into dvp_RdV values (to_date('01/01/2005 06:30', 'dd/mm/yyyy hh24:mi'), to_date('01/01/2005 07:30', 'dd/mm/yyyy hh24:mi'));

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Voila une meilleure requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Min(debut), Max(fin) 
    FROM (SELECT debut, fin, SubStr(sys_connect_by_path(ROWNUM, '/'), 2, Decode(InStr (sys_connect_by_path(ROWNUM, '/'), '/', 1, 2), 0, 1, InStr(sys_connect_by_path(ROWNUM, '/'), '/', 1, 2) - 2))  AS Groupe   
          FROM dvp_rdv a 
          CONNECT BY debut < PRIOR fin AND fin > PRIOR fin AND ROWID != PRIOR ROWID 
          START WITH NOT EXISTS (SELECT NULL 
                                 FROM dvp_rdv b 
                                 WHERE a.debut BETWEEN b.debut AND b.fin 
                                   AND a.ROWID != b.rowid)) 
    GROUP BY Groupe

Discussions similaires

  1. comparaison de dates javascript
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/07/2005, 09h45
  2. comparaison de dates
    Par pmithrandir dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/06/2005, 17h12
  3. comparaison de date
    Par nickoshiba dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/03/2005, 16h48
  4. Comparaison de dates
    Par Tapioca dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2004, 16h55
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo