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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 éclairé
    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
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 éclairé
    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
    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 éclairé
    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
    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

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