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 :

filtrage sur l'ajout d'un année à une date


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut filtrage sur l'ajout d'un année à une date
    Bonsoir,

    j'ai une table stages qui regroupe les stages disponible, et un champ recyclage qui représente les années durant lesquelles il est valide, avant de devoir le repasser, elle se présente comme ça:
    • id_st (l'id auto-incrémenté de la table)
    • st_titre (le nom du stage)
    • recyclage (le nombre d'année avant de devoir le repasser)


    et j'ai ma table pers_stages qui regroupe les stages passé par des personnes, ainsi que la date de réalisation :
    • id (l'id auto-incrémenté de la table)
    • personne (contient l'id de ma table personnels, c'est la personne qui a passé le stage)
    • stage (l'id du stage issu de ma table stages ci dessus)
    • date (la date à la quelle à était passé le stage)


    et enfin je souhaite faire une requête qui m'affiche la date de recyclage prévu 30 jours avant la date en cours :
    par exemple dans ma table Stages je crée le stage 'Sauvetage en mer' avec un recyclage tous les 1 ans.
    et dans ma table pers_stages j’insère pierre DUPONT (id numéro 4) qui a fait le stage 'Sauvetage en mer' le 15/11/2011

    ce qui signifie que le prochaine recyclage aura lieu le 15/11/2012, donc dans ma requête je souhaite le voir apparaître a partir du 15/10/2012, donc voila ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT stages.st_titre AS letitre, pers_stages.id AS id, DATE_FORMAT(pers_stages.date,'%d/%m/%Y') as ladate, DATE_ADD(pers_stages.date, INTERVAL stages.recyclage YEAR) as recy, CONCAT(personnels.pers_nom,' ', personnels.pers_prenom) as name
    FROM pers_stages, stages, personnels
    WHERE pers_stages.stage = stages.id_st
    AND personnels.id_pers = pers_stages.sp
    AND TO_DAYS(NOW())-TO_DAYS(recy)=30
    mais j'ai cette erreur :
    Unknown column 'recy' in 'where clause'
    pourtant je suit obligé de crée le champ recy car c'est lui qui m’additionne à la date de réalisation le nombre d'année de recyclage du stage !
    alors dois je le faire en php ? mysql ne le permet pas a partir de champ crée dans une requete ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Tu ne peux pas utiliser l'alias du SELECT dans le WHERE (sauf pour les sous-requêtes évidemment).
    L'ordre d'exécution des clauses est FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY.
    MySql autorise l'utilisation des alias dans le GROUP BY et le HAVING, il me semble, mais c'est généralement impossible.

    Au moment du WHERE l'alias n'est pas connu, utilise DATE_ADD directement dans le TO_DAYS.

  3. #3
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    oui tu dois donc donc remettre le calcul dans le where

    et passes au jointure avec (inner|cross|left) JOIN, tu y gagneras en lisibilité et surtout en compréhension de ce que tu brasses comme ensembles de de données...

  4. #4
    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
    On devrait pouvoir faire comme ça en MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT stages.st_titre AS letitre,
           pers_stages.id AS id, 
           DATE_FORMAT(pers_stages.date,'%d/%m/%Y') AS ladate, 
           DATE_ADD(pers_stages.date, INTERVAL stages.recyclage YEAR) AS recy, 
           CONCAT(personnels.pers_nom,' ', personnels.pers_prenom) AS name
    FROM pers_stages, stages, personnels
    WHERE pers_stages.stage = stages.id_st
    AND personnels.id_pers = pers_stages.sp
    HAVING TO_DAYS(NOW())-TO_DAYS(recy)=30
    Mais apparemment, il ne faut pas utiliser d'alias dans le HAVING...
    A part que ça n'est pas compatible avec les autres SGBD, je n'ai pas encore réussi à comprendre pourquoi.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Bizarre fred mais la requête ne donne rien !

    enfin c'est ici que ça doit poser problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING TO_DAYS(NOW())-TO_DAYS(recy)=30
    t'est sur qu'il peu prend l'alias recy en compte ?

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    ça devrait pas passer car tu n'as pas de group by... ou si ça génère pas d'erreur tu auras pas forcément le résultat attendu...

    les alias passe de ce que je m'en souviens dans having mais je suis pas sur...

    de toute façon les expressions sur les dates sont évaluées une seule fois par ligne dixit la doc donc c'est pas forcément le plus pénalisant...

  7. #7
    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
    Citation Envoyé par gastoncs Voir le message
    Bizarre fred mais la requête ne donne rien !
    Si cette requête donne quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT stages.st_titre AS letitre,
           pers_stages.id AS id, 
           DATE_FORMAT(pers_stages.date,'%d/%m/%Y') AS ladate, 
           DATE_ADD(pers_stages.date, INTERVAL stages.recyclage YEAR) AS recy, 
           CONCAT(personnels.pers_nom,' ', personnels.pers_prenom) AS name
    FROM pers_stages, stages, personnels
    WHERE pers_stages.stage = stages.id_st
    AND personnels.id_pers = pers_stages.sp
    AND TO_DAYS(NOW())-TO_DAYS(DATE_ADD(pers_stages.date, INTERVAL stages.recyclage YEAR) )=30
    Alors :
    1) faut que j'aille réviser le principe du HAVING.
    2) Au moins je saurai pourquoi il ne faut pas utiliser d'alias dans le HAVING...

  8. #8
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Non elle donne rien,

    j'ai juste changé ceci, car je veux afficher les recyclage, qui vont arrivé dans les 30 jours à partir de la date d'aujourd'hui, donc :
    mais la j'ai tous les résultat sans la condition sur recyclage, tampis ça doit pas être faisable donc je vais me tournée vers du php pour gérer ca

  9. #9
    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
    Citation Envoyé par ericd69 Voir le message
    ça devrait pas passer car tu n'as pas de group by... ou si ça génère pas d'erreur tu auras pas forcément le résultat attendu...
    Pourtant dans la doc il y a :
    The SQL standard requires that HAVING must reference only columns in the GROUP BY clause or columns used in aggregate functions. However, MySQL supports an extension to this behavior, and permits HAVING to refer to columns in the SELECT list and columns in outer subqueries as well.

  10. #10
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Le having est une clause associée à group by pour limiter les lignes sorties lors du classement, tu ne dois donc jamais l'utiliser hors de lui

    ensuite une comparaison ce fait comme çà:
    valeur - référence = écart signé

    sinon pour un écart absolu:
    abs(valeur - référence) = écart absolu

    le code devrait donc ressembler de tête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT stages.st_titre AS letitre,
    	pers_stages.id AS id,
    	DATE_FORMAT(pers_stages.date,'%d/%m/%Y') AS ladate,
    	DATE_ADD(pers_stages.date, INTERVAL stages.recyclage YEAR) AS recy,
    	CONCAT(personnels.pers_nom,' ', personnels.pers_prenom) AS name
    FROM personnels p
    inner join pers_stages ps1 on ps.sp = p.id_pers
    inner join stage s on ps.stage = s.id_st
    	and to_days(DATE_ADD(ps.date, INTERVAL s.recyclage YEAR))-to_days(now())

  11. #11
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Pourtant dans la doc il y a :
    oui tu dois te référer aux colonnes DANS LE GROUP BY... le but est de filtrer les lignes ISSUES DU GROUP BY

    comprend tu mieux le rôle de having?

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

Discussions similaires

  1. Ajout d'un mois ou d'une année à une date
    Par vaderetro33 dans le forum VB.NET
    Réponses: 4
    Dernier message: 03/05/2010, 20h05
  2. [Dates] Ajouter une année à une date
    Par viny dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2006, 00h16
  3. Ajout d'heure a une date, probleme de 24heures
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/07/2006, 12h01
  4. Soustraction d'année à une date
    Par spirou33 dans le forum Access
    Réponses: 2
    Dernier message: 09/01/2006, 13h30
  5. Ajouter 15 jours a une date
    Par azorol dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/12/2005, 14h36

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