web-dev-qa-db-fra.com

Rails ActiveRecord - comment récupérer des enregistrements entre deux dates

J'ai dans la base de données deux colonnes de date - from_date et to_date.

Exemple:

  • from_date: 2012-09-10
  • to_date: 2012-09-30
  • today: 2012-09-13

J'aurais besoin de récupérer tous les enregistrements si la date de today est comprise entre from_date et to_date. Comment faire cela dans une requête SQL?

Si j'ai chargé l'enregistrement correspondant, je peux facilement décider, si la date du jour se situe entre from_date et to_date, mais je ne sais pas comment extraire directement ces enregistrements de la base de données.

20
user984621
data = ModelName.where("today >= from_date AND today <= to_date")
20
Salil

Vérifiez les guides de rails on Conditions du Range:

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)

Cela produira le code SQL suivant:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00')
45
Paulo Fidalgo

vous pouvez utiliser comme ceci:

Data = Model.where("date(now()) between from_date and to_date")
7
M.Prabha karan
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
5
Ganesh Kunwar

Cela devrait faire l'affaire. 

today = Date.today

data = ModelName.where("from_date <= ? AND to_date >= ?", today, today)
2
rebbailey

Un moyen sûr et facile de faire cela serait:

Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
2
Tim K

Ok, après une longue recherche dans Google à la recherche d'une méthode "Rails" pour faire un BETWEEN avec deux champs de date et une variable, la solution la plus approximative que j'ai trouvée consiste à créer votre propre scope .

dans votre ApplicationRecord, écrivez:

class ApplicationRecord < ActiveRecord::Base

  scope :between_fields, -> (value, initial_date, final_date) { 
    where "('#{value}' BETWEEN #{initial_date} AND #{final_date})"
   }

end

Alors maintenant, partout où vous devez faire un entre-deux, vous pouvez faire:

@clients = Client.between_fields(params[:date], :start_date, :final_date)
# SELECT * FROM clients WHERE ('2017-02-16 00:00:00' BETWEEN start_date AND final_date)

Vous pouvez le combiner avec d'autres "où" pour effectuer votre requête de manière aussi spécifique que nécessaire.

1
alex

Vous pouvez utiliser gem ci-dessous pour trouver les enregistrements entre les dates,

Ce bijou est assez facile à utiliser et plus clair Par étoile j utilise ce bijou et l’API plus clair et la documentation également bien expliquée. 

ModelName.between_times(Time.zone.now - 3.hours,  # all posts in last 3 hours
                  Time.zone.now)

Ici, vous pouvez également passer notre champ ModelName.by_month("January", field: :updated_at)

Veuillez consulter la documentation et l'essayer.

1
Jenorish