データベースには2つの日付列-from_date
とto_date
があります。
例:
from_date
:2012-09-1to_date
:2012-09-today
:2012-09-1today
の日付がfrom_date
とto_date
の間にある場合、すべてのレコードをフェッチする必要があります。 SQLクエリでそれを行う方法?
それぞれのレコードをロードした場合、今日の日付がfrom_date
とto_date
の間にあるかどうかは簡単に判断できますが、データベースからそれらのレコードを直接フェッチする方法がわかりません。
data = ModelName.where("today >= from_date AND today <= to_date")
範囲の条件で Railsガイド を確認します。
Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)
これにより、次のSQLが生成されます。
SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00')
次のように使用できます:
Data = Model.where("date(now()) between from_date and to_date")
これを行う安全で簡単な方法は次のとおりです。
Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
これでうまくいくはずです。
today = Date.today
data = ModelName.where("from_date <= ? AND to_date >= ?", today, today)
以下のgemを使用して、日付間のレコードを検索できます。
このgemは非常に使いやすく、より明確です By star このgemとAPIをより明確に使用しており、ドキュメントもよく説明されています。
_ModelName.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours
Time.zone.now)
_
ここでもフィールドを渡すことができますModelName.by_month("January", field: :updated_at)
ドキュメントを参照して試してください。
OK、2つの日付フィールドと1つの変数でBETWEENを実行するための「Railsの方法」を探してグーグルで長時間検索した後、私が見つけた最も近い解決策は、独自の scope を作成してそれを行うことです。
applicationRecordに次のように書き込みます。
class ApplicationRecord < ActiveRecord::Base
scope :between_fields, -> (value, initial_date, final_date) {
where "('#{value}' BETWEEN #{initial_date} AND #{final_date})"
}
end
だから今、あなたが間に行う必要があるところはどこでもあなたは行うことができます:
@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)
それを他の「場所」と組み合わせて、必要に応じて具体的なクエリを実行できます。