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 :

Tri de dates d'anniversaires


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut Tri de dates d'anniversaires
    Bonjour,
    Je souhaite classer des dates d'anniversaires à partir de la date courante.
    J'ai testé deux clauses ORDER BY:
    1: ORDER BY DATE_FORMAT(m.birthday, '%m-%d') et
    2: ORDER BY DATE_FORMAT(m.birthday, "DATE_FORMAT(CURDATE(),'%Y')-%m-%d").
    La première classe les dates à partir du premier janvier, la seconde les classe par date de naissance.
    Comment classer les anniversaires à partir de la date d'aujourd'hui?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Voici un exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       with tab(DTN) as                                                                        
           (select '1985-12-20'   union all                            
            select '1999-03-02'   union all                            
            select '2002-10-08'   union all                            
            select '2010-06-15'                                        
           )                                                                                   
       select DTN as "date naissance"                                                          
            , case when current_date < concat(year(current_date), substr(DTN, 05, 06))
                   then concat(year(current_date), substr(DTN, 05, 06))                                                           
                   else cast(concat(year(date_add(current_date, interval 1 year)), substr(DTN, 05, 06)) as date)
              end  as date_anniversaire                                     
      from tab                                            
      order by date_anniversaire


    Résultat :
    Images attachées Images attachées  

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,
    Si j'ai bien compris il suffit juste de trier par mois-jour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by to_char(dtn, 'mmdd')

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    J'ai adapté le code à mon cas. J'ai ajouté une parenthèse manquante à la fin de la première ligne mais j'obtiens quand même une erreur de syntaxe que je ne trouve pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT birthday AS birthdate,
    	CASE  WHEN CURDATE() < CONCAT(YEAR(CURDATE(), SUBSTR(birthdate, 05, 06)))
    		THEN CONCAT(YEAR(CURDATE()), SUBSTR(birthdate, 05, 06))
    		ELSE CAST(CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL 1 YEAR)), SUBSTR(birthdate, 05, 06)) AS DATE)
    		END AS birthday
    FROM dat_members
    WHERE a.id_user=:id_user AND birthday IS NOT NULL
    ORDER BY birthday
    Erreur:
    Erreur de syntaxe près de ' SUBSTR(birthdate, 05, 06))) THEN CONCAT(YEAR(CURDATE()), SUBSTR(birthdate, 0' à la ligne 2 
    Je ne trouve pas où est cette erreur.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Le problème est que vous devez les classer aussi au dela du 31 décembre...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Les parenthèses sont mal placées, d'où l'erreur :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT birthday AS birthdate,
    	CASE  WHEN CURDATE() < CONCAT(YEAR(CURDATE()), SUBSTR(birthdate, 05, 06))
    		THEN CONCAT(YEAR(CURDATE()), SUBSTR(birthdate, 05, 06))
    		ELSE CAST(CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL 1 YEAR)), SUBSTR(birthdate, 05, 06)) AS DATE)
    		END AS birthday
    FROM dat_members
    WHERE a.id_user=:id_user AND birthday IS NOT NULL
    ORDER BY birthday

    Tatayo

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par moimp Voir le message
    J'ai adapté le code à mon cas. J'ai ajouté une parenthèse manquante à la fin de la première ligne mais j'obtiens quand même une erreur de syntaxe que je ne trouve pas.
    Il n'y avait pas de parenthèse manquante : la requête que j'ai fournie dans ma réponse n° 2 est opérationnelle, il suffit de la copier coller sans modification dans un interpréteur SQL pour le vérifier.

    Vous vous êtes pris les pieds dans le tapis en modifiant la requête que j'avais fournie (d'ailleurs pourquoi avoir remplacé current_date par curdate() alors que c'est exactement la même chose...)

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Oui, c'est une faute que j'aurais du trouver tout seul. Au temps pour moi.

    Il me reste cependant un point que je ne parviens pas à régler: Je veux utiliser l'alias final de la ligne 5 pour limiter la sélection à une date déterminée mais MySQL ne reconnaît pas cet alias comme un champ valide.

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    il suffit d'encapsuler la requête dans une requête corrélée :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    with tab(DTN) as                                                                        
           (select '1985-12-20'   union all                            
            select '1999-03-02'   union all                            
            select '2002-10-08'   union all                            
            select '2010-06-15'                                        
           )                                                                                   
      select * from ( 
      select DTN as "date naissance"                                                          
            , case when current_date < concat(year(current_date), substr(DTN, 05, 06))
                   then concat(year(current_date), substr(DTN, 05, 06))                                                           
                   else cast(concat(year(date_add(current_date, interval 1 year)), substr(DTN, 05, 06)) as date)
              end  as date_anniversaire                                     
      from tab                  
      ) subq
      where subq.date_anniversaire < '2024-06-30'
      order by date_anniversaire

    C'est l'un des très rares cas où SELECT * est autorisé, car sans danger pour les perfs ni vis à vis des évolutions éventuelles des tables et vues

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Merci à tous pour votre aide

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

Discussions similaires

  1. Tri par date d'anniversaire
    Par programaniac dans le forum Hibernate
    Réponses: 0
    Dernier message: 11/02/2015, 17h22
  2. tri par date
    Par Digiduck dans le forum Requêtes
    Réponses: 5
    Dernier message: 06/06/2005, 21h51
  3. [ XML ][ XSL ] tri par date
    Par zozolh2 dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/08/2004, 10h19
  4. Tri et Dates
    Par romainw dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/08/2004, 11h30
  5. Filtre, Tri, Index, Date
    Par gibet_b dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/07/2004, 16h30

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