Page 1 sur 1

problème d'ordre avec des dates de naissance

Posté : 09 août 2012, 14:51
par Neophyte
Bonjour,

J'ai une requête qui sort les anniversaires des 7 prochains jours (uniquement le jour et le mois) :

SELECT * FROM `tbl_personne`
WHERE
MONTH(`birth_p`) BETWEEN MONTH(current_date) AND MONTH(current_date + interval 7 day)
AND DAY(`birth_p`) BETWEEN DAY(current_date) AND DAY(current_date + interval 7 day)

Je bute sur une question de tri sans doute assez simple... Je voudrais que le tri se fasse selon la date du jour, à savoir : 10, 11, 12, 13, 14 août, etc.

Le champs (birth_p) est au format : 1990-08-10. Il faut donc pouvoir trier sur le sous-champs des jours pour avoir l'ordre adéquat.

Merci d'avance.

Re: problème d'ordre avec des dates de naissance

Posté : 09 août 2012, 14:58
par Zahnzao
Salut,

essaye ORDER BY SUBSTRING(birth_p,9,2)

;)

Re: problème d'ordre avec des dates de naissance

Posté : 09 août 2012, 16:01
par Mazarini
ORDER BY DAY(birth_p)
ou
ORDER BY DAYOFMONTH(birth_p)

Edit : dans ta clause where utilise DATE_FORMAT(date,'%m %d) pour le between car ca ne doit pas marcher en cas de changement de mois avec le +7
genre between 31 and 7

Edit 2 : edit aussi faux pour fin décembre...

Re: problème d'ordre avec des dates de naissance

Posté : 09 août 2012, 19:32
par Neophyte
OK, merci pour vos réponses.
A vrai dire, je me rends compte que la requête supporte mal le passage à un nouveau mois. En effet, l'extraction se fait une fois par semaine... et lorsque la semaine court sur 2 mois, cela ne donne pas les résultats attendus.

:roll:

Re: problème d'ordre avec des dates de naissance

Posté : 09 août 2012, 20:34
par Zahnzao
Simplement ceci devrait fonctionner non ?
SELECT *
FROM tbl_personne
WHERE DATE_FORMAT( `birth_p` , '%m%d' )
      BETWEEN DATE_FORMAT( NOW( ) , '%m%d' ) 
      AND DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL 7 DAY ) , '%m%d' )
Par contre pour le order by... effectivement lors du changement de mois ça coince.

Re: problème d'ordre avec des dates de naissance

Posté : 10 août 2012, 06:21
par Neophyte
Merci Zahnzao.

En l'état, l'ordre reste donc sans solution. En effet, au passage du mois, il faudrait directement avoir l'ordre suivant :
29/8
30/8
31/8
1/9
2/9

Alors que la requête sql renvoie les résultats dans l'ordre croissant "naturel"...

Re: problème d'ordre avec des dates de naissance

Posté : 10 août 2012, 09:16
par Mazarini
Tu peux essayer de travailler avec datediff en supprimant les années dans résultat et te baser sur ca pour faire de calcul et le tri.

ou

Il est possible de définir une fonction dans mySQL, tu peux réalisé une fonction qui calcul la prochaine date d'anniversaire et travailler avec le résultat de cette fonction. Tu calcules la date avec l'année en cours et si cette date est inférieure à la date du jour, tu ajoutes 1 an.
Tu peux alors sélectionner et trier sans problème. (http://docs.oracle.com/cd/E17952_01/ref ... n-udf.html)

Re: problème d'ordre avec des dates de naissance

Posté : 13 août 2012, 05:54
par Neophyte
Merci pour ces suggestions.
A 1ère vue, plutôt compliqué en utilisant que mysql... Je vais devoir cogiter.