Trier par date décroissante – mois, jour et année

Cela semble stupide mais, j'ai juste besoin d'une list de dates à order avec la date la plus récente en haut. Utiliser la order by DESC ne semble pas fonctionner comme je le veux.

 SELECT * FROM vw_view ORDER BY EventDate DESC 

Il me donne la date ordonnée par mois et par jour, mais ne prend pas l'année en considération. par exemple:

 12/31/2009 12/31/2008 12/30/2009 12/29/2009 

Doit être plus comme:

 12/31/2009 12/30/2009 12/29/2009 12/28/2009 

etc.

Je devine EventDate est un char ou varchar et pas une date sinon votre command par clause irait bien.

Vous pouvez utiliser CONVERT pour modifier les valeurs à une date et sortinger par cette

 SELECT * FROM vw_view ORDER BY CONVERT(DateTime, EventDate,101) DESC 

Le problème avec cela est, comme le souligne Sparky dans les commentaires, si EventDate a une valeur qui ne peut pas être convertie en une date, la requête ne s'exécutera pas.

Cela signifie que vous devez soit exclure les mauvaises lignes ou laisser les mauvaises lignes aller au bas des résultats

Pour exclure les mauvaises lignes, ajoutez simplement WHERE IsDate(EventDate) = 1

Pour laisser les mauvaises dates aller vers le bas, vous devez utiliser CASE

par exemple

 ORDER BY CASE WHEN IsDate(EventDate) = 1 THEN CONVERT(DateTime, EventDate,101) ELSE null END DESC 

Essayer:

 ORDER BY MONTH(Date),DAY(DATE) 

EDIT (Par user anonyme.)

Je crois que ce post est terminé avec, mais cet user ci-dessus a touché quelque chose qui a résolu mon problème au-dessus de tous les autres.

Si quelqu'un a des problèmes avec les autres solutions, essayez un mod mineur du code ci-dessus.

 ORDER BY YEAR(Date) DESC, MONTH(Date) DESC, DAY(DATE) DESC 

C'était ma dernière approche et cela fonctionnait parfaitement sur une DB JET.

PS. J'espère que personne n'utilise réellement Date comme nom de champ 😉

Vous avez le champ dans une string, vous aurez donc besoin de le convertir en datetime

 order by CONVERT(datetime, EventDate ) desc 

quel est le type du champ EventDate , puisque la command n'est pas correcte, je suppose que vous ne l'avez pas défini sur un type de date / heure, mais une string. Et puis la façon américaine d'écrire des dates est désagréable à sortinger

Si vous avez restructuré votre format de date en AAAA / MM / JJ, vous pouvez utiliser cette command de string simple pour get le format dont vous avez besoin.

Vous pouvez également utiliser la command SUBSTR (nom_magasin, start, length) pour restructurer le terme de sorting dans le format ci-dessus

peut-être en utilisant ce qui suit

 SELECT * FROM vw_view ORDER BY SUBSTR(EventDate,6,4) + SUBSTR(EventDate, 0, 5) DESC 

En supposant que vous avez le pouvoir de modifier les schémas, la seule réponse acceptable à cette question est de changer le type de données de base en quelque chose de plus approprié (par exemple, date si SQL Server 2008).

Le stockage des dates sous forme de strings mm/dd/yyyy est inefficace, difficile à valider correctement et rend le sorting et les calculs de date inutilement douloureux.