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 :

Récupérer les dates d'anniversaires de now() jusque dans 4 mois.


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut Récupérer les dates d'anniversaires de now() jusque dans 4 mois.
    Salut,

    Pour un cron, je dois faire une requete qui doit me récupérer les clients dont l'anniversaire est compris entre aujourd'hui jusque dans 4 mois.

    Aujourd'hui : 10/11/{2012}
    28/12/1980 : ok => 1 mois + 18 jours
    15/01/1970 : ok => 2 mois + 5 jours
    20/03/1990 : PAS ok
    25/06/1990 : PAS ok

    J'ai essayé plusieurs requete, mais les dates (mois) inférieurs au mois courant pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT lastname FROM ps_customer
    WHERE
              MONTH(birthday) BETWEEN MONTH(current_date + interval 1 month) AND MONTH(current_date)  
            AND DAY(birthday) BETWEEN DAY(current_date + interval 1 month) AND DAY(current_date);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT lastname, birthday FROM ps_customer WHERE  MONTH(birthday) <= MONTH(DATE_ADD(CURDATE(), INTERVAL 4 MONTH)) ;
    Une idée ?

    Merci
    Fabrice

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Utilise MOD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> select mod(month(d)+4,12)
        ->   from (select cast('2012-11-10' as date) as d union all
        ->         select cast('2012-01-10' as date) as d) temp;
    +--------------------+
    | mod(month(d)+4,12) |
    +--------------------+
    |                  3 |
    |                  5 |
    +--------------------+
    2 rows in set (0.00 sec)

  3. #3
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Aujourd'hui : 10/11/{2012}
    Il fait chaud pour un mois de novembre !

    Par rapport à une date D, les anniversaires depuis aujourd'hui jusqu'à dans 4 mois correspondent aux dates de naissance dont la concaténation de leur jour/mois à l'année en cours est comprise entre aujourd'hui et aujourd'hui + 4 mois.

    SQLPro râlerait parce que la norme ne prévoit pas de calculs sur les intervales de mois parce que le mois n'a pas une longueur fixe mais je trouve que le principe retenu par MySQL n'est pas trop mal et tombe assez juste dans la plupart des cas, toujours juste quand on n'est pas proche des bornes du mois.

    Essaie cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT lastname 
    FROM ps_customer
    WHERE STR_TO_DATE(CONCAT(YEAR(CURRENT_DATE), '-', DATE_FORMAT('birthday', '%m-%d')), '%Y-%m-%d') BETWEEN CURRENT_DAY AND DATE_ADD(CURRENT_DATE, INTERVAL 4 MONTH)
    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 !

  4. #4
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    Salut à tous,

    CURRENT_DAY n'existe pas sous mysql , c'est çà non ? : En plus, cela sera pas plutot ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN  CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 4 MONTH)
    En corrigeant, les fautes de syntaxe, ont dirai que la requete doit être celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT lastname, birthday 
    FROM ps_customer
    WHERE STR_TO_DATE(CONCAT(YEAR(CURRENT_DATE), '-', DATE_FORMAT(birthday, '%m-%d')), '%Y-%m-%d') BETWEEN CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 4 MONTH);
    C'est bon pour vous ?

    Merci
    Fabrice

  5. #5
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par __fabrice Voir le message
    Salut à tous,

    CURRENT_DAY n'existe pas sous mysql , c'est çà non ? :
    Au temps pour moi ! C'est effectivement CURRENT_DATE et pas CURRENT_DAY !
    Faute de frappe puisque je l'ai utilisé au début et à la fin du WHERE.

    En plus, cela sera pas plutot ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN  CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 4 MONTH)
    Oui c'est ça.

    En corrigeant, les fautes de syntaxe, ont dirai que la requete doit être celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT lastname, birthday 
    FROM ps_customer
    WHERE STR_TO_DATE(CONCAT(YEAR(CURRENT_DATE), '-', DATE_FORMAT(birthday, '%m-%d')), '%Y-%m-%d') BETWEEN CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 4 MONTH);
    C'est bon pour vous ?
    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 !

  6. #6
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    Merci à tous.

    Par contre, je n'ai pas essayé la première méthode de "skuatamad", mais je pense que faire un UNION, qui est très gourmand en ressources, n'est pas tres approprié dans ce cas là.

    Bonne journée.
    Fabrice

  7. #7
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    Salut,

    A priori, cela ne marche pas lorsque la date du jour est le 10/12/2012 et que l'anniversaire est le 05/01/2013 (choix avec 1 d'interval).

    Une idée ?

    Fabrice

  8. #8
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    Celle-ci marche mieux (selection en jours) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT firstname,birthday
    FROM ps_customer
    WHERE datediff( MAKEDATE( YEAR(NOW()) , DAYOFYEAR(birthday) ) , NOW())
         BETWEEN 0 AND 30
       OR datediff( MAKEDATE( YEAR(NOW())+1 , DAYOFYEAR(birthday) ) , NOW())
         BETWEEN 0 AND 30;

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Le souci quand vous arrivez à la fin de l'année, c'est que votre anniversaire se trouve sur l'année prochaine.

    Il faut donc modifier de la sorte :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT lastname, birthday 
    FROM ps_customer
    WHERE (
       month(birthday > 4) and STR_TO_DATE(CONCAT(YEAR(CURRENT_DATE), '-', DATE_FORMAT(birthday, '%m-%d')), '%Y-%m-%d') BETWEEN CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 4 MONTH)
    ) or (
       month(birthday <= 4) and STR_TO_DATE(CONCAT(YEAR(CURRENT_DATE) + 1, '-', DATE_FORMAT(birthday, '%m-%d')), '%Y-%m-%d') BETWEEN CURRENT_DATE AND DATE_ADD(CURRENT_DATE, INTERVAL 4 MONTH)
    );

    Aussi, je trouve cette méthode plus propre, car je ne passe pas par la représentation varchar de la date, et ne travaille qu'avec des dates.

    En revanche, c'est les fonction SQL Server, mais c'est assez simple à traduire en MySQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select cli_id, cli_naissance
    from client
    where 
    (
        MONTH(cli_naissance) >= 4
    and DATEADD(year, year(getdate()) - year(cli_naissance), cli_naissance) between GETDATE() and DATEADD(MONTH, 4, GETDATE())
    )
    or 
    (
        MONTH(cli_naissance) < 4
    and DATEADD(year, year(getdate()) - year(cli_naissance) + 1, cli_naissance) between GETDATE() and DATEADD(MONTH, 4, GETDATE())
    );
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. [Calendrier] Récupérer les dates des vacances scolaires, c'est possible ?
    Par fayred dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 13
    Dernier message: 10/10/2016, 18h45
  2. Réponses: 3
    Dernier message: 05/02/2009, 17h01
  3. Réponses: 4
    Dernier message: 24/11/2008, 13h13
  4. Récupérer les dates de l'année en cours sur SQL Server
    Par And_res dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/10/2008, 09h51
  5. Réponses: 11
    Dernier message: 05/06/2008, 11h04

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