Classement de dates au formats AAAA-MM-JJ

WRInaute occasionnel
Bonjour à tous,

J'ai une liste d'éléments dans une BDD que je souhaiterai classer par date, de la plus proche à la plus éloignée.

Parfois, le jour et le mois sont inconnus, je ne met dans ce cas que l'année, ex : "2007-00-00".

Comment classer ces dates correctement ? Car un simple "ORDER BY" ne fonctionnet pas correctement, ce qui est normal, puisqu'entre "2006-00-00" et "2006-11-10", il renvoi d'abord "2006-00-00"...

Or, je voudrais que dans le classement apparaissent d'abord les dates complètes (ex : 2006-11-10), puis les dates qui n'ont pas de jour (ex : 2006-11-00), puis les dates qui n'ont que l'année (ex : 2006-00-00)...

Je ne trouve pas... Merci d'avance !!!
 
WRInaute impliqué
Tiens un sunmagic ! :D Décidemment on se croise (TK_Elitetom sur JV.com).

Tes champs sont ils de type DATETIME ? Normalement un order by devrait marcher si je ne me trompe pas...
 
WRInaute occasionnel
Salut ;)

Non, ils sont au format DATE seulement, et l'ORDER BY classe les dates du type "2006-00-00" avant "2006-11-15" par exemple...
 
WRInaute discret
T'as pas trop le choix je dirais...
A moins d'ajouter un champ fuzzy_date qui vaudrait 1 pour toutes les dates de la forme 2006-00-00, du coup, tu peux préciser
Code:
ORDER by fuzzy_date, date
Il commence par trier sur le critère fuzzy date, donc te met toutes tes dates pourries à lafin, puis pour ceussent qui ont le même fuzzy date, par date. Et ça marche !
 
WRInaute discret
pour eviter d'avoir des dates qui n'existent pas (2006-00-00), utiliser d'abord la fonction checkdate()
sinon tu peux tenter un
ORDER BY madate>'2006-00-00', madate ASC
 
WRInaute occasionnel
Je vais tester tout ca, merci ;)

jarreweb > Je n'ai pas bien compris où je devais inclure le checkdate() ?
 
WRInaute discret
Correction, j'avais mal lu ton message initial.
Il te faut 2 champs supplémentaires: no_month et no_day
et tu fais un
Code:
ORDER by no_month, no_day, date
 
WRInaute occasionnel
Merci ! Je viens de tester : on progresse, mais ce n'est pas encore ca...

En effet, une date comme le "2007-03-30" passe avant "2006-11-00", par exemple...
 
WRInaute discret
il faut utiliser checkdate() avant d'insérer la date
pour vérifier sur la date à insérer est valide ou pas
 
WRInaute impliqué
Avec ou sans raisons cela reste abérant. Conceptuellement, j'aimerai bien comprendre comment tu es arrivé à ce résultat là.
 
WRInaute occasionnel
Désolé d'en avoir choqué certains avec mes méthodes peu recommandables apparement ;)

Merci encore à ceux qui m'ont aidé. :wink:
 
Discussions similaires
Haut