2011-08-11 4 views
0

J'ai un champ de dates comme "2011-06-30" dans la base de données de mon application rails. Les dates pourraient être dans une gamme de quelques mois. Je voudrais savoir comment interroger en utilisant AR pour trouver les mois distincts dans ma base de données.requête pour des mois distincts dans ActiveRecord

Les résultats que je veux retrouver avec quelque chose comme:

[January, February, April, June] 
+0

quelle base de données? sqlite? mysql? poster? – fl00r

+1

le développement est sqlite mais la production sera postgres. J'espérais une solution non spécifique à une base de données. – Brand

+0

Quand vous dites que vous avez des dates comme "2011-06-30", sont-elles stockées comme * strings * dans la base de données ou sont-elles stockées comme une sorte de champ date/heure? – Zabba

Répondre

1

Merci @Pierre mais comment je l'ai fait

MyModel.all.map { |d| d.my_date_field.strftime('%b %y') }.uniq 

Cela me donne quelque chose comme

["Jun 11", "Jul 11", "Aug 11"] 
3

pas sûr qu'il ya une façon pure AR pour le faire.

avec Postgre, vous pouvez le faire comme ceci:

Model.select("distinct date_part('month',your_date_field) as my_months").all 

ce reviendriez un tableau comme [1,3,10].

Vous pouvez ensuite afficher les valeurs de votre tableau en utilisant Date::MONTHNAMES[your month] pour avoir le nom complet au lieu du numéro.

MISE À JOUR - D'après le commentaire de Caley, et probablement plus DB agnostique

Yourmodel.select('distinct date_field').all.collect{|x| x[:date_field].month}.uniq 

donnera

[1, 5, 6, 7, 8, 11, 12, 2, 3, 4, 9, 10] 

Si vos données couvre plus de 1 an, cela signifie que vous serez itérer plus de 365 éléments max. (366 dans les mauvaises années). Alors peut-être que le coup de performance est acceptable. J'ai essayé d'exécuter cette

(Date.new(2011,1,1)..Date.new(2011,12,31)).collect{|x| x.month}.uniq 

Et le résultat vient instantanément

+1

'' 'Model.find_by_sql()' '' est aussi une option ici aussi bien que trouver tous les mois et appeler '' '.uniq''' bien que cela ne soit pas aussi performant. –

Questions connexes