web-dev-qa-db-ja.com

Rails ActiveRecord-2つの日付の間でレコードを取得する方法

データベースには2つの日付列-from_dateto_dateがあります。

例:

  • from_date2012-09-1
  • to_date2012-09-
  • today2012-09-1

todayの日付がfrom_dateto_dateの間にある場合、すべてのレコードをフェッチする必要があります。 SQLクエリでそれを行う方法?

それぞれのレコードをロードした場合、今日の日付がfrom_dateto_dateの間にあるかどうかは簡単に判断できますが、データベースからそれらのレコードを直接フェッチする方法がわかりません。

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

範囲の条件で 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')
50
Paulo Fidalgo

次のように使用できます:

Data = Model.where("date(now()) between from_date and to_date")
7
M.Prabha karan

これを行う安全で簡単な方法は次のとおりです。

Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
6
Tim K
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
5
Ganesh Kunwar

これでうまくいくはずです。

today = Date.today

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

以下の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)

ドキュメントを参照して試してください。

1
Jenorish

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)

それを他の「場所」と組み合わせて、必要に応じて具体的なクエリを実行できます。

0
alex