24

2つの日付列があります-from_dateそしてto_dateデータベーステーブルにあります。

例:

  • from_date2012-09-10
  • to_date2012-09-30
  • today2012-09-13

todayの日付がとの間の場合、すべてのレコードをフェッチする必要がfrom_dateありto_dateます。SQLクエリでそれを行うにはどうすればよいですか?

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

4

8 に答える 8

54

範囲条件に関する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')
于 2014-09-19T08:57:23.190 に答える
25
data = ModelName.where("today >= from_date AND today <= to_date")
于 2012-09-13T11:09:58.077 に答える
11

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

Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
于 2017-12-20T16:16:04.353 に答える
8

あなたはこのように使うことができます:

Data = Model.where("date(now()) between from_date and to_date")
于 2016-11-02T15:11:42.223 に答える
5
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
于 2012-09-13T10:54:01.830 に答える
3

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

today = Date.today

data = ModelName.where("from_date <= ? AND to_date >= ?", today, today)
于 2016-10-03T08:38:13.830 に答える
1

以下のgemを使用して、日付間のレコードを検索できます。

このgemは非常に使いやすく、より明確です。スターによってこの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)

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

于 2015-02-05T13:04:23.950 に答える
0

わかりました。2つの日付フィールドと変数を使用してBETWEENを実行するための「レールの方法」をグーグルで長い間検索した後、私が見つけた最もおおよその解決策は、それを行うための独自のスコープを作成することです。

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)

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

于 2017-02-16T16:13:27.783 に答える