Forum Clubic

[SQL] Comment ordonner un champ DATE de manière particulière ?(résolu)

Salut à tous,

Voilà, sous MySQL j’ai une table avec un champ DATE qui contient des anniversaires (c’est imporant pour la suite), et je cherche une requête pouvant me classer ces dates d’anniversaire de la plus proche à la plus lointaine et ce à partir de la date du jour.

Exemple :
nom date

Mick 1967-05-19
Tom 1979-07-30
Angel 1929-05-01
Ann 1983-02-12
Olive 1948-05-27
Hugo 1957-01-10
Flam 1989-12-20

Si on est le 10 mai 2005 je voudrais :
nom date

Mick 1967-05-19
Olive 1948-05-27
Tom 1979-07-30
Flam 1989-12-20
Hugo 1957-01-10
Ann 1983-02-12
Angel 1929-05-01

Car l’anniversaire de Mick est le prochain à fêter, suivi de celui d’Olive, Tom, etc. pour finir avec celui d’Angel qui vient de se passer…

Je doit dire que je n’ai pas beaucoup d’idées car je pensais faire un truc du genre :
SELECT (DATE_FORMAT(CURRENT_DATE, “%m”) - DATE_FORMAT(date, “%m”)) as mois, (DATE_FORMAT(CURRENT_DATE, “%e”) - DATE_FORMAT(date, “%e”)) as jours, nom, date FROM anniversaires ORDER BY mois DESC, jours DESC

mais cela me retourne :
nom date

Hugo 1957-01-10
Ann 1983-02-12
Angel 1929-05-01
Mick 1967-05-19
Olive 1948-05-27
Tom 1979-07-30
Flam 1989-12-20

Autrement dit : j’ai réussi le tri mais je ne pars pas du bon endroit…

@++

Ben :

ORDER BY MONTH(date) DESC, DAY(date) DESC, YEAR(date) DESC

?

Ben non,

Il veut que par exemple, en partant d’aujourd’hui 11 mai, quelqu’un qui est né le 10 mai 1940 par exemple, arrive en dernier dans la liste.
Pour la requête tu regarderas, mais sinon il faut construire pour chaque ligne une date avec l’année en cours, et le mois et le jour de la date d’anniversaire.
Si la date obtenue est inférieure à la date du jour, alors tu ajoutes un an.
Ensuite, tu trie selon la date ainsi obtenue. Je pense qu’on peut le faire avec MySQL, en utilisant IF(…).
Par contre, si quelqu’un est né un 29 février, je pense que la reconstitution de la date va poser un sérieux problème… cas particulier à traiter ???

Valoche

Sans-Nom -> La requête que tu me donne est plus clair que la mienne mais donne exactement le même résultat (au passage, DAY() ne marche pas : il faut mettre DAYOFMONTH() et classer en ASC au lieu de DESC)

edit : je n’avais pas raffraichi mon navigateur, donc pas vu la réponse de Valoche -> à creuser, mais je ne vois pas trop comment faire à priori pour modifier l’année de mon champ date

J’ai trouvé ! Merci à Valoche pour son idée :

SELECT IF (MONTH(date)<=MONTH(CURRENT_DATE), 1, IF (MONTH(date)=MONTH(CURRENT_DATE) AND DAYOFMONTH(date)<DAYOFMONTH(CURRENT_DATE), 1, 0)) as mois, IF (DAYOFMONTH(date)<DAYOFMONTH(CURRENT_DATE), 1, 0) as jours, nom, date FROM anniversaires ORDER BY mois, MONTH(date), jours, DAYOFMONTH(date)

C’est bien bourrin, mais ça marche ! :wink: