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 :

[Oracle] Calculer date sortie en fonction de l'enrgt suivant


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 10
    Points
    10
    Par défaut [Oracle] Calculer date sortie en fonction de l'enrgt suivant
    j'ai une table qui contient trois champs:
    NumPersonne, DateEntree et secteur qui décrit les passages par secteur,
    une personne peut passer par plusieurs secteurs.
    je veux crée une autre table identique mais en rajoutant un champs DateSortie qui sera calculé en foncion de la date d'entree et du secteur.
    pour la même personne la date de sortie d'un secteur=a la date d'entree dans le secteur suivant.
    le champ DateSortie est juste un décallagge d'une ligne du champ DateEntree.

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut, et bienvenue sur ce forum,

    Merci de lire les Conseils à lire avant de poster, et de préciser le SGBD.
    Merci également de spécifier des titre pertinents.

    Je veux crée une autre table identique mais en rajoutant un champs DateSortie qui sera calculé en foncion de la date d'entree et du secteur.
    Pourquoi une autre table, et pas un champ supplémentaire ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Voici un jeu d'essai et une proposition de solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE Passage (
    NumPersonne NUMBER(2),
    DateEntree  VARCHAR2(10),
    Secteur     VARCHAR2(10));
     
    INSERT INTO Passage VALUES (1, '2006/03/15', 'Sect. 18');
    INSERT INTO Passage VALUES (1, '2006/03/17', 'Sect. 03');
    INSERT INTO Passage VALUES (1, '2006/03/20', 'Sect. 12');
     
    INSERT INTO Passage VALUES (2, '2006/03/16', 'Sect. 18');
    INSERT INTO Passage VALUES (2, '2006/03/18', 'Sect. 23');
    pour ne pas me casser la tête avec des format date, j'ai pris du varchar en stockant année/mois/jour, pour le tri.

    Voici la requête proposée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SELECT P1.NumPersonne, P1.DateEntree, P1.Secteur, P2.DateEntree AS DateSortie
      FROM Passage P1 INNER JOIN Passage P2 ON P1.NumPersonne = P2.NumPersonne
     WHERE P2.DateEntree = (SELECT MIN(p3.DateEntree) 
                              FROM Passage p3
                             WHERE p3.DateEntree > P1.dateEntree
                               AND p3.NumPersonne = P1.NumPersonne)
    UNION
    SELECT P1.NumPersonne, P1.DateEntree, P1.Secteur, NULL
      FROM Passage P1
     WHERE P1.DateEntree = (SELECT MAX(p3.DateEntree) 
                              FROM Passage p3
                             WHERE p3.NumPersonne = P1.NumPersonne)			 
    ORDER BY NumPersonne, DateEntree
     
    NUMPERSONNE DATEENTREE SECTEUR    DATESORTIE
    ----------- ---------- ---------- ----------
              1 2006/03/15 Sect. 18   2006/03/17
              1 2006/03/17 Sect. 03   2006/03/20
              1 2006/03/20 Sect. 12
              2 2006/03/16 Sect. 18   2006/03/18
              2 2006/03/18 Sect. 23
    Le premier SELECT permet de "calculer" la date de sortie en prenant la valeur minimum des dates suivantes sur la même personne,
    Le second SELECT s'occupe des "derniers" enregistrements.

    Pour que ça fonctionne, il faut également éviter les doublons sur (NumPersonne, dateEntree) !

    Bon, je m'y suis peut-être mal pris , si quelqu'un a une solution avc une jointure externe, ça permettrai sans doute d'éviter le UNION ...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    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
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.NumPersonne, a.DateEntree, a.Secteur,  MIN(b.dateentree) AS DateSortie
    FROM Passage a LEFT JOIN Passage b ON a.NumPersonne = b.NumPersonne
                                      AND b.DateEntree > a.DateEntree
    GROUP BY a.NumPersonne, a.DateEntree, a.Secteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1  2006/03/15 Sect. 18  2006/03/17
    1  2006/03/17 Sect. 03  2006/03/20
    1  2006/03/20 Sect. 12  (null)
    2  2006/03/16 Sect. 18  2006/03/18
    2  2006/03/18 Sect. 23  (null)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    merci beaucoup pour votre aide.
    je vous tiens au courant aprés les tests

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Médiat
    Quelque chose comme :
    Humpf, il me semblait bien que je m'étais un peu fourvoyé

    Bien vu
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calcul entre date oracle et date pc
    Par jifi63 dans le forum Oracle
    Réponses: 13
    Dernier message: 18/11/2010, 16h58
  2. Réponses: 6
    Dernier message: 26/03/2009, 10h32
  3. Calcul d'une date de fin : fonction INTERVAL ?
    Par vingsxr dans le forum SQL
    Réponses: 4
    Dernier message: 13/03/2009, 12h13
  4. [MySQL] Calculer l'âge en fonction de la date de naissance
    Par loic20h28 dans le forum PHP & Base de données
    Réponses: 49
    Dernier message: 16/10/2008, 13h49
  5. Réponses: 6
    Dernier message: 25/03/2006, 16h09

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