À l'aide de la COMMANDE PAR sur SELECT DISTINCT en TSQL
Je suis en train de récupérer une liste de chaînes date classés par date comme ça...
SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate
FROM dbo.ProviderProcessGeneratedDate
ORDER BY GeneratedDate
Cette commande par le varchar que j'ai converti les dates.
exemple...
02/01/2008
02/15/2008
02/21/2007
02/23/2007
02/29/2008
J'ai travaillé autour de cette l'aide d'une ligne de requête...
SELECT CONVERT(Varchar(10), a.GeneratedDate, 101) AS GeneratedDate
FROM (SELECT DISTINCT Convert(DATETIME,CONVERT(Varchar(10), GeneratedDate, 101)) AS GeneratedDate
FROM dbo.ProviderProcessGeneratedDate) a
ORDER BY a.GeneratedDate DESC
Pour obtenir ce que je veux vraiment...
01/11/2008
01/04/2008
12/28/2007
12/21/2007
Est-il un moyen plus facile? Ressemble à beaucoup de travail à faire quelque chose de si simple.
Vous devez vous connecter pour publier un commentaire.
La raison de votre première requête a donné un ordre différent de ce que tu voulais, c'est...
- Vous utilisez le champ "GeneratedDate" pour créer votre chaîne
- Vous ensuite alias de champ de résultat pour "GeneratedDate"
- Vous ensuite de l'ordre par "GeneratedDate", sans préciser la table
- Si le résultat est utilisé pour la commande de
La seule solution est mentionné dans d'autres réponses...
Par l'indication de la table il n'y a pas de confusion et vous obtenez les résultats que vous vouliez.
[de côté]
Comme une règle que j'ai toujours préfixe de mes champs avec [table]. pour éviter toute ambiguïté. Surtout depuis que j'ai souvent revenir plus tard, et ajouter dans une jointure, forçant la ned pour la table nom.
Aussi, je l'alias de la table des noms. Pas à des choses comme [un], mais quelque chose de significatif, comme [Dates]. Cela réduit la requête, mais me permet aussi de modifier le tableau de l'être utilisé sans avoir à changer d'autres références dans d'autres parties de la requête.
[fin de l'aparté]
EDIT:
J'ai quitté ma réponse précédente par la voie de l'humilité moi-même. J'ai vraiment devez obtenir une maison de sql server, de sorte que je peux tenter ma réponse avant que je poste ma réponse... ***Excuses*
Que le commentaire états-unis, vous ne pouvez pas spécifier quelque chose dans l'ORDRE si ce n'est pas dans le SELECT DISTINCT.
Donc je voudrais essayer de GROUPE PAR la place...
Cela suppose GeneratedDate est de 1:1 avec votre CONVERTIR formule. Si, par exemple, vous avez un TEMPS dans votre GeneratedDate champs, mais votre Format de Date dans CONVERTIR n'a pas; vous avez besoin de dépouiller le temps de la GeneratedDate Champ...
Juste à ajouter aux réponses ci-dessus...
Vous pouvez convertir des chaînes de caractères en dehors de tsql. Juste de retour de type datetime et de les convertir vers un format de date que vous souhaitez dans le code (affichage de la couche).
Vous pouvez également utiliser CTE si vous êtes à l'aide de SQL 2005 ou 2008.
votre code devrait ressembler à:
Je pense que vous pouvez utiliser:
pour le forcer à utiliser la valeur de la table d'origine, à la place de votre nouvelle valeur modifiée? Vous pouvez même ajouter un alias à la clause from:
De sorte que vous pouvez utiliser la "favorisant l'égalité entre" alias à la place de l'ensemble de la tablename dans ma première déclaration.
Peut-être vous avez juste besoin d'utiliser un alias de champ afin qu'il utilise la date de la commande plutôt que de la chaîne mise en forme? I. e.
Bien que dans la plupart des cas, vous devriez vraiment être en laissant la date de la date et de faire toute la mise en forme dans l'INTERFACE utilisateur au dernier moment possible.
Modifier l'ORDRE de l'original de votre relevé d'utiliser un sortable chaîne de date:
Utilisation
GROUP BY
au lieu deDISTINCT
: