requete sql pour passer a la ligne prochaine

Petit nouveau ! | 4 Messages

29 mai 2010, 14:39

Bonjour a tous,

J'ai un petit soucis,
But :
Je souhaiterais creer un module pour un site qui permettrait d'annoncer la prochaine date d'anniversaire d'un membre.

J'ai créé une table sql contenant les dates sans année, les noms de membres et un ID auto incrémenté.
Au milieu de cette table un champ s'appelle "aujourd'hui" qui se met a jour tout les jours.
J'aimerais trouver une requete qui permet de sélectionner la ligne qui suit la ligne "aujourdhui".

Voici un morceau du tableau pour plus de clarté. :
Image

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 mai 2010, 16:20

Quelle idée bizarre cette colonne "aujourd'hui" ! Tu peux connaître la date du jour dans n'importe quel langage de programmation... et via des fonctions MySQl aussi... et "la ligne qui suit" dans une table ça ne veut rien dire, on trie les données à la sélection, par ordre alphabétique par exemple, mais elle ne sont pas stockées triées.

Donc, qu'est-ce que tu veux faire en fait ? Je veux dire, en Français, sans technique, exemple : "je veux afficher chaque jour ceux qui fêtent leur anniversaire aujourd'hui"

Petit nouveau ! | 4 Messages

29 mai 2010, 16:24

Ok, c'est possible que je m'y prenne mal, je ne suis pas encore très bon en programmation.

Ce que je voudrais faire, c'est afficher quelle sera la prochaine date d'anniversaire.

en gros ça devrait donner ça:
"le prochain anniversaire dans la team est celui de "membre untel" "

Eléphant du PHP | 74 Messages

30 mai 2010, 04:24

Bonsoir,

Il faut comparer la date d'aujourd'hui avec le jour et le mois des données.

Le problème c'est qu'il faut convertir tes données au format date.

1> il faut concatener la prochaine année avec les dates dans la base pour la comparaison
CONCAT(YEAR(NOW())+1,'-',date) : on obtient une date de type "yyyy-mm-jj"

2> il faut obtenir les dates qui suivent aujourd'hui
DAY(NOW()) <= CONCAT(YEAR(NOW())+1,'-',date) et MONTH(NOW()) <= CONCAT(YEAR(NOW())+1,'-',date)

3> Il faut ordonner selon le mois puis le jour pour avoir la prochaine date la plus proche et faire un limit pour n'avoir qu'une réponse
ORDER BY MONTH( CONCAT( YEAR( NOW( ) ) +1, '-', date ) ) ASC , DAY( CONCAT( YEAR( NOW( ) )+1 , '-', date ) ) ASC LIMIT 1

ça donne en gros :
SELECT * 
FROM `table` 
WHERE DAY( NOW( ) ) <= DAY( CONCAT( YEAR( NOW( ) )+1 , '-', date ) ) 
AND MONTH( NOW( ) ) <= MONTH( CONCAT( YEAR( NOW( ) ) +1, '-', date ) ) 
ORDER BY MONTH( CONCAT( YEAR( NOW( ) ) +1, '-', date ) ) ASC , DAY( CONCAT( YEAR( NOW( ) ) +1, '-', date ) ) ASC
LIMIT 1
Il y a surement une méthode plus simple...

Est-ce que tu comprends le +1 au niveau des années ? C'est pour gérer un cas un peu particulier! mais lequel ?
le +1 m'oblige à utiliser DAY et MONTH, pourquoi ?

Petit nouveau ! | 4 Messages

30 mai 2010, 15:41

Merci pour la réponse,
ça fait plaisir que tu t'y sois attelé ;)

j'ai assez bien compris le code, mais il donne pas vraiment le bon résultat, j'l'ai un peu modifié mais il reste un petit soucis :

SELECT * FROM phpboost_annif
WHERE (DAY( NOW( ) ) <= DAY( CONCAT( YEAR( NOW( ) ) +1 , '-', dates ) )
AND MONTH( NOW( ) ) = MONTH( CONCAT( YEAR( NOW( ) ) +1, '-', dates ) ))
OR (MONTH( NOW( ) ) < MONTH( CONCAT( YEAR( NOW( ) ) +1, '-', dates ) ))
ORDER BY MONTH( CONCAT( YEAR( NOW( ) ) +1, '-', dates ) ) ASC , DAY( CONCAT( YEAR( NOW( ) ) +1, '-', dates ) ) ASC
LIMIT 1 
Mais pour une raison que j'ignore, si la date d'aujourd'hui est le :
2010/05/30
Il ne veut pas accepter
2010/06/31 comme réponse d'anniversaire,
Alors qu'il accepte 2010/06/29

Mais sinon, merci beaucoup pour la réponse, je cherchais dans une mauvaise direction.

Mammouth du PHP | 672 Messages

31 mai 2010, 10:58

Mais pour une raison que j'ignore, si la date d'aujourd'hui est le :
2010/05/30
Il ne veut pas accepter
2010/06/31 comme réponse d'anniversaire,
Alors qu'il accepte 2010/06/29
Peut-être parce que le 31/06 n'existe pas ! :mrgreen:

Eléphant du PHP | 74 Messages

03 juin 2010, 16:59

En effet, ça ne prend pas en compte les dates qui n'existent pas :)

Petit nouveau ! | 4 Messages

04 juin 2010, 08:28

Lol,

Un point marqué ;)
Merci beaucoup pour ton aide, ça m'a beaucoup aidé.
J'ai enfin pu finir mon module, me reste plus qu'a le traduire en phpboost.
On peut clore le sujet.