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

Requêtes MySQL Discussion :

Touver des intervalles de dates continues


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut Touver des intervalles de dates continues
    Voilà, j'ai une table qui contient des catégories, des dates et des tarifs. Chaque catégorie peut avoir différents tarifs pour des dates différentes, une catégorie ne peut avoir qu'un tarif à une date donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Id        CatId    Dateg             Tarif 
    ------  ------   ------------   ---------
    000001      12   2009-07-07     1
    000002      12   2009-07-08     1
    000003      12   2009-07-09     1
    000004      12   2009-07-10     2
    000005      12   2009-07-15     1
    000006      12   2009-07-16     1
    000007      13   2009-07-08     1
    000008      13   2009-07-09     1
    000009      14   2009-07-07     2
    000010      14   2009-07-08     1
    000010      14   2009-07-10     1
    Index unique (CatId,Dateg,Tarif)
    Je voudrais détecter pour une catégorie donnée des intervalles de dates continues de même tarif et garder que le début et la fin de l'intervalle.
    Pour l'exemple précédent, on aura :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CatId    Debut            Fin                Tarif 
    ------   ------------   ------------   ---------
    12        2009-07-07    2009-07-09     1
    12        2009-07-10    2009-07-10     2
    12        2009-07-15    2009-07-16     1  
    13        2009-07-08    2009-07-09     1  
    14        2009-07-07    2009-07-07     2
    14        2009-07-08    2009-07-08     1
    14        2009-07-10    2009-07-10     1
    Comme j'arrivais pas à faire une requête SQL qui donne le résultat attendu, je parcours la table (triée par CatId, Dateg et Tarif) (fonction PHP) en détectant les continuités et les discontinuités des dates. Mais je suis sur qu'il existe une solution meilleure en MySQL.
    Voilà un début d'idée mais qui ne donne pas ce que je cherche!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CatId, min(Dateg) AS Debut, max(Dateg) AS Fin, Tarif
    FROM MaTable
    GROUP BY  CatId, Tarif
    Merci de votre aide!

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    En sql pur il faudrait utiliser une requête récursive (voir des fonctions analytique).

    Bref dans les deux cas MySql ne sait pas faire ça.


    Il resterai peut être une solution avec une procedure imbriqué dans la requête ... mais si vous avez déjà fait le code en PhP je ne m’embêterai pas.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Bonjour,

    Juste une petite remarque, dans ton exemple de résultat, tu as mis :
    ...
    14 2009-07-08 2009-07-10 1

    Comme il n'y a pas de 2009-07-09 ne serait-ce pas plutôt ?:
    ...
    14 2009-07-08 2009-07-08 1
    14 2009-07-10 2009-07-10 1

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Bonjour,

    Juste une petite remarque, dans ton exemple de résultat, tu as mis :



    Comme il n'y a pas de 2009-07-09 ne serait-ce pas plutôt ?:
    tu as raison Fred_34, j'ai corrigé le résultat

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Citation Envoyé par punkoff Voir le message
    bonjour,


    En sql pur il faudrait utiliser une requête récursive (voir des fonctions analytique).

    Bref dans les deux cas MySql ne sait pas faire ça.


    Il resterai peut être une solution avec une procedure imbriqué dans la requête ... mais si vous avez déjà fait le code en PhP je ne m’embêterai pas.
    La solution suivante marche bien en mysql en utilisant les variables définit par l'utilisateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT   CatID, debut, MAX(Date) AS fin, tarif
    FROM (
      SELECT   my_table.*,
               @f:=CONVERT(
                 IF(@c<=>CatId AND @r<=>tarif AND DATEDIFF(Date, @d)=1, @f, Date), DATE
               ) AS debut,
               @c:=CatId, @d:=Date, @r:=tarif
      FROM     my_table JOIN (SELECT @c:=NULL) AS init
      ORDER BY CatId, tarif, Date
    ) AS t
    GROUP BY CatID, debut, tarif
    Mais finalement je suis revenu a ma fonction PHP, c'est beaucoup plus claire!

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

Discussions similaires

  1. Requêtes sur des intervalles de dates
    Par Tidus159 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/05/2011, 17h43
  2. [XL-2007] Probl formule avec des intervales de dates
    Par alexandrek dans le forum Excel
    Réponses: 0
    Dernier message: 09/02/2011, 12h56
  3. intersection des intervalles de date
    Par AJ_ing dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2011, 16h26
  4. [MySQL 5.5] Requete pour des intervalles de dates
    Par Kaldyris dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/04/2009, 19h50
  5. [Transact SQL] Comparer des intervales de dates
    Par jowsuket dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/05/2008, 12h25

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