2013-03-20 4 views
1

J'ai besoin d'aller chercher des informations dans ma base de données. Chaque rangée a une date formatée comme janvier 2013. Comment les trier comme la date la plus tardive sera donnée en premier? Ces informations n'ont pas été insérées, c'est pourquoi elles doivent d'abord être triées. Je vous remercie! :)Tri avec date personnalisée dans mysql

+0

Avez-vous une date ou seulement le mois et l'année présents sur la valeur? –

+0

convertir ces dates "personnalisées" en un champ natif date/date/heure et votre problème disparaît fondamentalement. ** NE JAMAIS ** stocker des formats personnalisés lorsqu'un format natif fonctionnera. –

+0

J'ai utilisé varchar pour les dates. Merci pour ça. :) – user2189557

Répondre

0

Vous avez enregistré la date dans varchar. donc utiliser la fonction STR_TO_DATE() pour le tri

SELECT * FROM table WHERE STR_TO_DATE(column, %M %Y) ORDER BY column DESC 
+1

Je l'ai utilisé parce que je ne pouvais plus changer de structure. Cela fonctionne bien pour moi. Merci! – user2189557

+0

Content de vous aider :) merci –

2

La mise en forme de date n'a pas d'importance si vous conservez votre date dans une colonne de type approprié, par exemple TIMESTAMP, DATE, etc. Si votre date est conservée dans VARCHAR, votre base de données est simplement rompue. premier.

0

ok, c'est difficile, mais il pense qu'il sorte est la seule façon puisque vous avez varchar comme dans votre table type de données. Cela fonctionne, mais je ne suis pas sûr de la performance avec des données de table à grande échelle. L'astuce consiste à diviser votre varchar en 2 champs mumber, un avec l'année et avec le numéro du mois.


SELECT mydate 
FROM mytable 
ORDER BY RIGHT(mydate,4) DESC, //get the year 
CASE LEFT(mydate,INSTR(mydate,' ')-1) 
WHEN 'January' THEN 1 
WHEN 'February' THEN 2 
WHEN 'March' THEN 3 
WHEN 'April' THEN 4 
WHEN 'May' THEN 5 
WHEN 'June' THEN 6 
WHEN 'July' THEN 7 
WHEN 'August' THEN 8 
WHEN 'September' THEN 9 
WHEN 'October' THEN 10 
WHEN 'November' THEN 11 
WHEN 'December' THEN 12 
END DESC //get the month and turn in to number