2010-08-14 6 views
1

Dans ma base de données j'ai un nom de mois comme janvier, février, mars comme ça.ms accès db ordre par mois asc numéro

Je représente le nom du champ est du texte. Quand j'exécute la requête de sélection avec l'ordre par le mois de champ mois, il fournira la sortie en février, janvier comme ça.

Je sais qu'il est clair par la représentation du champ FORMAT ou db. Bien que je suis nouveau à l'accès ms, donc je ne connais pas le bon format pour cela. Aidez-moi, s'il vous plaît.

Répondre

0

Ajouter une colonne supplémentaire à la table (s) avec les mois qui ont le numéro de mois dans l'année, ou mieux, ne pas stocker des mois comme des chaînes, au lieu de les stocker comme des dates par ex. 1er août 2010, ce qui rendra ce problème considérablement plus facile à résoudre.

+0

OK. Y a-t-il un autre moyen de prendre la conversation dans le champ d'ordre (comme 'ordre par mois (' '..field name'') asc')? – Karthik

+0

Je ne suis pas un expert en Access - mais je m'attendrais à ce que vous puissiez commander par un calcul et que le calcul puisse être '1 /' + month + '/ 2010' ou similaire - à savoir une commande par date. –

+0

La suggestion de la table de recherche fonctionnera beaucoup mieux, car le tri sur une expression ne peut pas utiliser les index. –

0

Conserver les mois comme des entiers comme actuellement vos lignes sont renvoyées en utilisant le tri alpabetic (comment savoir que la base de données ces chaînes il y a des mois?): Avril, Août, Février, Janvier, Mars ...

+0

Si je stocke comme entiers, est-ce que cela résout mon problème? – Karthik

+0

Oui, cela devrait fonctionner comme prévu. – plaes

+0

Comment ça marche? Je ne peux pas vous obtenir ... – Karthik

1

Vous allez devez créer votre propre fonction personnalisée dans un module qui modifie la valeur pour vous.

Quelque chose comme

Public Function StrToMonth(strIn As String) As Integer 
Dim arrMonth(12) As Variant 
Dim i As Integer 

arrMonth(0) = "January" 
arrMonth(1) = "February" 
arrMonth(2) = "March" 
arrMonth(3) = "April" 
arrMonth(4) = "May" 
arrMonth(5) = "June" 
arrMonth(6) = "July" 
arrMonth(7) = "August" 
arrMonth(8) = "September" 
arrMonth(9) = "October" 
arrMonth(10) = "November" 
arrMonth(11) = "December" 

For i = 0 To UBound(arrMonth) - 1 
If strIn = arrMonth(i) Then 
StrToMonth = i + 1 
Exit Function 
End If 
Next i 
End Function 

Et puis vous pouvez l'utiliser dans vos requêtes comme

SELECT Table1.MonthVal 
FROM Table1 
ORDER BY StrToMonth([MonthVal]); 
+0

laissez-moi vérifier ceci ... – Karthik

+2

Je pense qu'une table supplémentaire et une jointure seraient plus rapides que la fonction. – dwo

+0

Je ne pense pas que vous ayez besoin d'une fonction personnalisée. Il y a plusieurs possibilités purement SQL. – Fionnuala

0

Vous pouvez convertir le mois à une date à des fins de tri:

SELECT MonthName 
FROM SomeTable 
ORDER BY CDate("1/" & [MonthName] & "/2010"); 
0

Si vous avez décidé qu'il est inapproprié de stocker les mois en tant que dates réelles (et il pourrait certainement être - je ne suis pas critique cette décision), vous souhaitez optimiser les performances en stockant vos données dans un format le plus efficace possible. C'est probablement le stockage du mois sous la forme d'un nombre entier.

À des fins d'affichage, par exemple dans des rapports, ou sur un formulaire, vous pouvez afficher le nom du mois en utilisant le format. Il est un peu délicat, car il n'y a pas de conversion directe (où « MonthField » fait référence au champ où vous stockez l'entier mois):

Format(DateSerial(Year(Date()), MonthField, 1), "mmmm") 

Une alternative serait d'avoir une table qui mappe un entier mois à le nom du mois, mais cela ajoute une jointure, et si le champ peut être vide, vous devez avoir une jointure externe, ce qui est beaucoup plus coûteux en termes de performances qu'une jointure interne. N'oubliez pas que vous utiliserez l'instruction Format() uniquement dans la couche de présentation, c'est-à-dire en tant que source de contrôle d'un contrôle sur un formulaire ou un état. Sur les formulaires, vous utiliseriez probablement une zone de liste déroulante à deux colonnes à cet effet, de sorte que l'utilisateur verrait le nom du mois, mais la valeur stockée serait en fait le mois entier. Dans ce cas, un tableau peut avoir un sens, mais je ne suis pas certain qu'il aurait un réel avantage à saisir une liste de valeurs - ce n'est pas comme si c'était une donnée volatile, c'est-à-dire ce qui est la principale raison pour laquelle vous utiliseriez une table à la place d'une liste de valeurs)!

EDIT:

Comme @HansUp l'a souligné, il y a une fonction MonthName() en VBA (je ne savais pas que ça existait!), De sorte que fait tout le chemin ci-dessus plus compliquée qu'elle doit être - vous pouvez l'utiliser dans la couche de présentation sans avoir besoin d'une table ou de l'instruction compliquée Format().

+1

Si MonthField contient des valeurs entières, utilisez 'MonthName (MonthField)' – HansUp

+0

Je ne savais pas que cette fonction existait! Apprendre quelque chose de nouveau chaque jour! –