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.
data = ModelName.where("today >= from_date AND today <= to_date")
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')
vous pouvez utiliser comme ceci:
Data = Model.where("date(now()) between from_date and to_date")
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
Cela devrait faire l'affaire.
today = Date.today
data = ModelName.where("from_date <= ? AND to_date >= ?", today, today)
Un moyen sûr et facile de faire cela serait:
Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
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.
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.