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 :

Trouver les lignes suivant une date d'expiration


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut Trouver les lignes suivant une date d'expiration
    Bonjour,

    J'aimerais faire une requête, mais je sais pas si cela est réalisable, je m'explique.

    J'ai une table mysql nommée "facture":

    - idFacture => id unique
    - fk_idContrat => id du contrat, lié à la table "contrat"
    - dateStart
    - dateEnd

    Voici un exemple de ce que peut contenir cette table (dans l'ordre des champs décrit plus haut):

    1, 1, 09-05-2011, 08-05-2012
    2, 1, 09-05-2012, 08-05-2013
    3, 1, 09-05-2013, 08-05-2014
    4, 2, 12-05-2011, 11-05-2012
    5, 2, 12-05-2012, 11-05-2013

    J'aimerais faire une requête qui me sort les factures dont la date de fin est déjà passé OU sera passé dans 40 jours, et cela pour chaque contrat.

    Donc il faut déjà que je trouve la plus grande date de fin pour chaque contrat et après tester si la date arrive à expiration?

    Déjà comment trouver la plus grande date? Je dois faire des sous-requêtes?

    Merci d'avance

  2. #2
    Membre averti Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Points : 416
    Points
    416
    Par défaut
    Bonjour,

    Cela devrait t'aider :

    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT idFacture FROM facture
               WHERE (TO_DAYS(dateEnd) - TO_DAYS(NOW()))<= 40
               OR TO_DAYS(dateEnd) < TO_DAYS(NOW());

    En gros : tu ramène la date en jours (nombre de jours calculé depuis le "0000-00-00").

    Et tu fais la différence : si ta date de fin moins ta date actuelle est inférieure à 40, alors tu retourne l'ID.

    De même si ta date de fin est inférieure à la date actuelle (donc la date est passée), alors tu retourne l'id.

  3. #3
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Merci pour votre réponse, j'avais déjà aussi trouver une piste avec ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    date_add(CURDATE(), interval + 40 day)
    Votre requête fonctionne, mais maintenant j'aimerais qu'il me sorte la date de fin la plus grande, j'ai essayer comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT idFacture, MAX(dateFinFacture) AS isMax FROM facture
               WHERE (TO_DAYS(isMax) - TO_DAYS(NOW()))<= 40
               OR TO_DAYS(isMax) < TO_DAYS(NOW());
    Mais il me renvoie qu'il ne trouve pas la colonne isMax...on ne peut pas servir les colonne "virtuel" dans un WHERE?

  4. #4
    Membre averti Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Points : 416
    Points
    416
    Par défaut
    Je ne suis pas sur d'avoir compris. Tu veux qu'il te renvoit la date la plus grande PARMI les dates passées ou celles qui le seront dans 40jours ?

    Si oui, il suffit de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT idFacture, MAX(dateFinFacture) AS isMax FROM facture
               WHERE (TO_DAYS(dateEnd) - TO_DAYS(NOW()))<= 40
               OR TO_DAYS(dateEnd) < TO_DAYS(NOW());
    Il ne faut pas remplacer dateEnd pas isMax, car en effet cela ne peux pas marcher : tu fais une condition sur le résultat de ta requête, qui n'est donc pas encore créé.

  5. #5
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    J'aimerais, pour chaque contrat (fk_idContrat) qu'il prenne la date la plus grande (date de la dernière facture) et qu'il regarde si cette date arrivera à bout dans 40 jours ou si elle est déjà à bout.

    Pour récupérer les dates avec les 40 jours c'est ok, mais pour les plus grande je suis coincé.

    Faut-il pas d'abord qu'il trouve la plus grande date pour chaque contrat via une sous-requête?

    Merci

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Quelle est la date de fin maxi pour chaque contrat ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT fk_idContrat, MAX(dateEnd) AS dateEnd_maxi
    FROM facture
    GROUP BY fk_idContrat
    Maintenant, que veux tu conserver dans le résultat de ta requête ?
    - les contrats dont la date de fin maxi est supérieure à aujourd'hui + 40 jours ?
    - les contrats dont la date de fin maxi est inférieure à aujourd'hui + 40 jours ?
    - 40 jours inclus ou exclus ?

    Il suffit d'ajouter la condition adéquate dans un HAVING. Par exemple, pour le premier cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT fk_idContrat, MAX(dateEnd) AS dateEnd_maxi
    FROM facture
    GROUP BY fk_idContrat
    HAVING MAX(dateEnd) > DATE_ADD(CURRENT_DATE, INTERVAL 40 DAY)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Désolé pour le temps de réponse, j'ai du mettre de côté ce projet...mais je le reprend en main depuis quelques jours...

    Enfait je dois trouver la facture la plus récente pour chaque contrat.

    J'ai essayé avec votre requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT fk_idContrat, MAX(dateEnd) AS dateEnd_maxi
    FROM facture
    GROUP BY fk_idContrat
    Ca me trouve bien les dernière date pour le champ MAX(), mais les id des facture ne corresponde pas, il me prend pour chaque contrat, l'id de la 1ère facture qu'il trouve et non le dernier...

    Une idée de comment "inverser" cela?

    Merci

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Il faut faire une jointure de ma requête avec la table des factures pour récupérer la facture correspondant à la date trouvée et au contrat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT f.idFacture
    FROM facture f
    INNER JOIN
    (
    	SELECT fk_idContrat, MAX(dateEnd) AS dateEnd_maxi
    	FROM facture
    	GROUP BY fk_idContrat
    ) tmp 
    	ON tmp fk_idContrat = f.fk_idContrat
    	AND tmp.dateEnd_maxi = f.dateEnd
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Chapeau sur ce coup là, j'y serais jamais arrivé, du coup ma requête donne ça:

    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
     
    SELECT f.idFacture, f.dateFinFacture, c.idContrat, s.urlSite
    FROM facture f
    LEFT JOIN contrat c ON f.fk_idContrat = c.idContrat
    LEFT JOIN site s ON c.fk_idSite = s.idSite
    INNER JOIN
    (
    	SELECT fk_idContrat, MAX(dateFinFacture) AS dateEnd_maxi
    	FROM facture
    	GROUP BY fk_idContrat
    ) tmp 
    	ON tmp.fk_idContrat = f.fk_idContrat
    	AND tmp.dateEnd_maxi = f.dateFinFacture
    WHERE f.dateFinFacture <= DATE_ADD(CURRENT_DATE, INTERVAL 40 DAY)
    ORDER BY s.urlSite
    Ca me récupère la facture pour chaque contrat qui arrive à bout dans 40 jours.

    Par contre est-ce possible d'avoir une explication sur votre requête, je ne la comprend pas totalement avec cet INNER JOIN, c'est en gros une sous-requête qui va sélectionner les plus grandes dates?

    Merci pour votre aide

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    INNER JOIN = jointure interne
    LEFT [OUTER] JOIN = jointure externe (à gauche).

    Pour en apprendre plus sur les jointures, voir le site de SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/03/2013, 12h06
  2. Trouver les lignes en fonction d'un écart de date
    Par StringBuilder dans le forum SQL
    Réponses: 11
    Dernier message: 20/02/2012, 20h49
  3. [XL-2003] Modifier le le format Date sur toute les lignes d'une colonne
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/08/2010, 14h00
  4. Réponses: 17
    Dernier message: 09/02/2010, 16h22
  5. Réponses: 5
    Dernier message: 06/11/2007, 13h58

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