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 :

Sélection entre date dans un catalogue


Sujet :

Langage SQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Sélection entre date dans un catalogue
    Bonsoir,

    Je veux faire une requête dans ma base de données pour extraire dans le catalogue les produits avec le bon n° de catalogue en fonction de la date du jour.

    Ma table catalogues ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    produit    date_debut    nbr_jours    date_fin    catalogue
    4043        01/06/09        476        00-00-00    173
    5295        01/06/09        476        00-00-00    173
    5295        01/08/10         50        24/10/10    328
    5304        01/06/09        476        00-00-00    173
    5304        01/08/10         50        24/10/10    328
    5456        01/06/09        476        00-00-00    173
    5459        01/06/09        476        00-00-00    173
    Le champ nbr_jours est en fait le nombre de jour entre CURDATE() et aujourd'hui que j'obtiens avec un DATEDIFF().

    Ma requête initial
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT produit, date_debut, DATEDIFF(curdate(), date_debut) AS 'nbr_jours',, date_fin, catalogue
    FROM catalogue
    WHERE (CURDATE() BETWEEN date_debut AND date_fin
    OR date_debut <= CURDATE
    AND date_fin = '00-00-00'
    Le résultat que je souhaite avoir est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    produit    date_debut    nbr_jours    date_fin    catalogue
    4043        01/06/09        476        00-00-00    173
    5295        01/08/10         50        24/10/10    328
    5304        01/08/10         50        24/10/10    328
    5456        01/06/09        476        00-00-00    173
    5459        01/06/09        476        00-00-00    173
    Je n'arrive pas à faire fonctionner mes méninges pour avoir ce résultat, sauf à le faire en plusieurs requêtes.

    Merci d'avance pour vos lumières

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    As-tu vu le post presqu'en dessous du tien.
    http://www.developpez.net/forums/d97...derniere-date/

    Il me semble que la problématique est la même.
    A moins que je n'ai pas compris comment tu passais de ton premier select au deuxième résultat.

    PS : Es-tu sûr qu'il n'y a pas de problème de parenthèse dans ta requete, avec le OR.
    A+
    Soazig

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonsoir,

    En fait, vous avez besoin de ne selectionner par produit que la dernière ligne de catalogue, celle en cours de validité. Au vu de votre exemple, il semble s'agir de celle avec la date de debut la plus grande.

    Je vous propose donc :

    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  c1.produit
           , c1.date_debut
           , DATEDIFF(curdate(), c1.date_debut) AS 'nbr_jours'
           , c1.date_fin
           , c1.catalogue
        FROM catalogue c1
       WHERE (   (CURDATE() BETWEEN c1.date_debut AND c1.date_fin)
              OR (    c1.date_debut <= CURDATE
                  AND c1.date_fin = '00-00-00')
             )
         AND NOT EXISTS
            (SELECT 1
               FROM catalogue c2
              WHERE c2.Produit = c1.produit
                AND (   (CURDATE() BETWEEN c1.date_debut AND c1.date_fin)
                     OR (    c1.date_debut <= CURDATE
                         AND c1.date_fin = '00-00-00')
                    )
                AND c2.date_debut > c1.date_debut
            )
    Cdlt,
    OD

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Une chose me turlupine, quels sont les types de date_debut, date_fin?
    A priori cela devrait être des dates mais je ne connais pas la date '--.--.--', du coup je me pose des questions.
    [Edit]Quel est ton SGBD?[/Edit]
    A+
    Soazig

  5. #5
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par soazig Voir le message
    Bonjour,
    Une chose me turlupine, quels sont les types de date_debut, date_fin?
    A priori cela devrait être des dates mais je ne connais pas la date '--.--.--', du coup je me pose des questions.
    [Edit]Quel est ton SGBD?[/Edit]
    A+
    Soazig
    Je suis sur MySql et ce sont des champs de type date donc aaaa-mm-jj.

    L'exemple est juste là pour présenter le problème donc effectivement il y possibilité d'interprétation.

  6. #6
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par soazig Voir le message
    Bonjour,
    As-tu vu le post presqu'en dessous du tien.
    http://www.developpez.net/forums/d97...derniere-date/

    Il me semble que la problématique est la même.
    A moins que je n'ai pas compris comment tu passais de ton premier select au deuxième résultat.

    PS : Es-tu sûr qu'il n'y a pas de problème de parenthèse dans ta requete, avec le OR.
    A+
    Soazig
    Oui peut-être.

    Si j'ai bien compris, la solution retenu est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM 
    (
    SELECT *, row_no = row_number() over (partition BY TraderCode,MatchKey ORDER BY Date DESC)
    FROM Prices
    ) i
    WHERE i.row_no = 1
    Mais d'où viennent les champs TraderCode,MatchKey ?

  7. #7
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par Olivier Dufour Voir le message
    Bonsoir,

    En fait, vous avez besoin de ne selectionner par produit que la dernière ligne de catalogue, celle en cours de validité. Au vu de votre exemple, il semble s'agir de celle avec la date de debut la plus grande.

    Je vous propose donc :

    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  c1.produit
           , c1.date_debut
           , DATEDIFF(curdate(), c1.date_debut) AS 'nbr_jours'
           , c1.date_fin
           , c1.catalogue
        FROM catalogue c1
       WHERE (   (CURDATE() BETWEEN c1.date_debut AND c1.date_fin)
              OR (    c1.date_debut <= CURDATE
                  AND c1.date_fin = '00-00-00')
             )
         AND NOT EXISTS
            (SELECT 1
               FROM catalogue c2
              WHERE c2.Produit = c1.produit
                AND (   (CURDATE() BETWEEN c1.date_debut AND c1.date_fin)
                     OR (    c1.date_debut <= CURDATE
                         AND c1.date_fin = '00-00-00')
                    )
                AND c2.date_debut > c1.date_debut
            )
    Cdlt,
    OD
    Merci Olivier, oui c'est effectivement la date de début la plus grande sélectionnée.

    Vous êtes les mêmes protagonistes que sur le post que soazig a mis en lien.

    Je creuse donc vos requêtes en tenant compte des tests de performances déjà réalisés

  8. #8
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    La solution dans mon cas a été de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IF(MAX(date_debut) = date_debut, id_catalogue, MAX(id_catalogue)) AS 'id_catalogue'
    Et ça fonctionne.

    Merci à vous.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je ne comprends pas ton bout de requête, pourrais-tu mettre la requête complète.
    Merci
    Soazig

  10. #10
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT IF(MAX(date_debut) = date_debut, catalogue, MAX(catalogue)) AS 'catalogue'
    FROM catalogue
    WHERE (CURDATE() BETWEEN date_debut AND date_fin
    OR date_debut <= CURDATE
    AND date_fin = '00-00-00'

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

Discussions similaires

  1. Sélection d'une date dans un calendrier
    Par navis84 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 17/04/2012, 17h12
  2. [ASP] Sélection de dates dans un calendrier
    Par benoit85 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 06/03/2009, 10h59
  3. Différence entre date dans le même curseur
    Par jad dans le forum PL/SQL
    Réponses: 2
    Dernier message: 28/11/2008, 11h35
  4. Comparaison entre deux dates dans une table
    Par Biskot75 dans le forum Access
    Réponses: 6
    Dernier message: 19/09/2006, 11h16
  5. [SQL Server] Sélection entre deux dates
    Par Gabrielly dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/06/2006, 14h51

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