2010-03-15 3 views
1

J'ai une table MySQL qui stocke (entre autres choses) une date de naissance des personnes.Trier le tableau MySQL par date d'échéance suivante

Y at-il un moyen de trier la table afin que le prochain anniversaire soit en haut? J'ai la date stockée dans le format standard aaaa-mm-jj DATE et sépare les champs année, mois et jour afin que je puisse trier par le premier anniversaire de l'année (ORDER BY mois, jour) mais je ne peux pas semblent aller plus loin.

Toute aide serait grandement appréciée.
Zagga

Répondre

0

Il n'est pas nécessaire de stocker séparément l'année, le mois ou le jour.
Et vous n'avez pas non plus besoin de commander votre table.

Tout ce que vous avez à faire est de commander votre requête comme vous le souhaitez.
Quelque chose comme cela devrait vous aider à démarrer:

SELECT month(t.dob) as m, 
     dayofmonth(t.dob) as d, 
    FROM mytable t 
ORDER BY 1,2 
0
Select ... 
From 'Table' 
Where DayOfYear(BirthDate) <= DayOfYear(CurDate()) 
Order By DayOfYear(BirthDate) Desc 

En raison de l'utilisation intensive des fonctions dans le cas et clause Order By cela ne rempliraient probablement pas bien.

EDIT David Gelhar a la bonne idée pour la liste complète. Une autre façon serait:

Select ... 
From 'Table' 
Where DayOfYear(BirthDate) <= DayOfYear(CurDate()) 
Order By Case 
      When DayOfYear(BirthDate) <= DayOfYear(CurDate()) Then 0 
      Else 1 
      End ASC 
    , DayOfYear(BirthDate) DESC 

Encore une fois, pas la meilleure requête, mais elle devrait vous donner la réponse que vous voulez.

0

Question intéressante, parce que pour bien faire les choses, vous devez obtenir les anniversaires restants pour cette année, puis passer à l'année prochaine. Quelque chose comme:

Select ... 
From 'Table' 
Where DayOfYear(BirthDate) >= DayOfYear(CurDate()) 
Order By DayOfYear(BirthDate) 
union 
Select ... 
From 'Table' 
Where DayOfYear(BirthDate) < DayOfYear(CurDate()) 
Order By DayOfYear(BirthDate) 

EDIT En pensant à cela, vous fait ne besoin d'utiliser le cassé sur « mois » et « jour » champs au lieu de simplement regarder DayOfYear; sinon, vous obtiendrez la mauvaise réponse si cette année est bissextile et que la personne est née dans une année non bissextile (ou vice versa). C'est parce que nous considérons notre anniversaire comme étant le «1er mars», pas «le 60e jour de l'année».

Et, bien sûr, vous ne pouvez pas utiliser différents « trier par » clauses dans les deux moitiés de l'UNION ...

Donc, quelque chose comme:

Select 1,mon,day,name 
From 'Table' 
Where mon > Month(CurDate()) 
    or ((mon = Month(CurDate())) 
     and (day >= DayOfMonth(CurDate()))) 
union 
Select 2,mon,day,name 
From 'Table' 
Where mon < Month(CurDate()) 
    or ((mon = Month(CurDate())) 
     and (day < DayOfMonth(CurDate()))) 
Order By 1,2,3