2 votes

Rails date sans année

Comment puis-je trouver un enregistrement par date, mais sans l'année ?

Voici ce que j'ai :

@date = Date.today
@article = Article.find_by_date(@date)

Mais ce que je veux vraiment faire, c'est rechercher un article qui ne contient que le mois et le jour. L'année n'est pas importante.

2voto

Testé avec SQLite :

Model.find(:all, :conditions => ["STRFTIME('%m-%d', field_name) = '?-?'", 12, 25])

La requête générée illustre comment cela permet de trouver tout ce qui se trouve dans les cas suivants field_name c'est Noël :

Model Load (16.1ms)  SELECT "models".* FROM "models" WHERE (STRFTIME('%m-%d', field_name) = '12-25')

J'ai également eu du succès avec la formule plus courte "field_name LIKE '%-MM-DD'", mais il s'agissait de MySQL ; selon son manuel, il utilise effectivement des chaînes pour lire et écrire les dates. A VOUS DE VOIR.

1voto

MrTheWalrus Points 5907

Je pense que cela dépend de la base de données que vous utilisez. Les différentes implémentations ont des noms/syntaxes différents pour la fonction EXTRACT ou DATE_PART. Sur PostgreSQL, celle-ci fonctionne :

Model.where('EXTRACT(month FROM field_name) = ? AND EXTRACT(day FROM field_name) = ?', 12, 25)

1voto

Victor Rodrigues Points 149

Vous pouvez le faire :

Model.all.where(["DAY(`date`) = ? AND MONTH(`date`) = ?", Date.current., 12])

C'est simple !

0voto

ricsrock Points 453

Une approche agnostique de la base de données serait d'ajouter des attributs à votre modèle pour la date_mois et la date_jour (et de les définir avec un appel before_save). Quelque chose comme :

before_save :set_date_day_and_month

def set_date_day_and_month
  self.date_month = date.month
  self.date_day = date.day
end
#untested

Vous pouvez alors faire des requêtes simples qui n'impliquent pas de fonctions spécifiques à la base de données. Par exemple :

Article.where('date_month = ? AND date_day = ?', 12, 25)
#for articles on Christmas

Ou :

Article.where('date_month = ? AND date_day = ?', Date.today.month, Date.today.day)
#for articles on this date any year

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X