problème d'ordre avec des dates de naissance

Eléphant du PHP | 57 Messages

09 août 2012, 14:51

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.

Eléphant du PHP | 190 Messages

09 août 2012, 14:58

Salut,

essaye ORDER BY SUBSTRING(birth_p,9,2)

;)

ViPHP
ViPHP | 2577 Messages

09 août 2012, 16:01

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...

Eléphant du PHP | 57 Messages

09 août 2012, 19:32

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:

Eléphant du PHP | 190 Messages

09 août 2012, 20:34

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.

Eléphant du PHP | 57 Messages

10 août 2012, 06:21

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"...

ViPHP
ViPHP | 2577 Messages

10 août 2012, 09:16

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)

Eléphant du PHP | 57 Messages

13 août 2012, 05:54

Merci pour ces suggestions.
A 1ère vue, plutôt compliqué en utilisant que mysql... Je vais devoir cogiter.