2011-05-10 20 views
25

私は取引のテーブルを持っており、今日の日付と日付が一致するレコードを見つける必要があります。今日の日付と一致する日時を持つレコードを見つける - Ruby on Rails

レールコンソールから、一致する必要がある日付フィールドは次のようになります。私はテストのためにレコードを割り当てました。

ruby-1.9.2-p0 > deal.start 
=> Tue, 10 May 2011 00:00:00 UTC +00:00 

私はこのように、今日で開始日に一致するレコードを検索しようとすると、私はその後、私はdatetime型にDate.todayを変換することで一致すると考えていた

ruby-1.9.2-p0 > Deal.find_by_start(Date.today) 
=> nil 

nilを取得します。

ruby-1.9.2-p0 > Date.today.to_datetime 
=> Tue, 10 May 2011 00:00:00 +0000 
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime) 
=> nil 

これを動作させるにはどうすればよいですか?私はRailsの3を使用してい

編集: 私は作品がなく、日時が保持している

ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
=> true 

ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
NoMethodError: undefined method `strftime' for nil:NilClass 

答えて

46

は覚えておいてくださいfind_by_startメソッドを使用してしようとしません一貫性のある形式にそれらの両方の変換について考えました日付と時刻が含まれているため、同じ日だけでなく、正確な値を持つレコードを探しています。

2つの方法のいずれかを実行できます。 1日の始めから終わりまでの時間範囲を選択するか、date列を作成してデータをグループ化することができます。

範囲のバージョンは次のようになります。

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all 

他の一つは、あなたのテーブルに新しいstart_date列を作成し、それに応じて、日付とそれを埋める必要になります。範囲の選択が大規模なデータセットでは必ずしも迅速であるとは限らないため、この日付のインデックスを作成してクエリをより高速に実行できます。

+0

ありがとうございます。これはうまくいきますし、短期間にこれを使用し、パフォーマンス改善のために自分のコードをリファクタリングします。ご協力いただきありがとうございます。 –

+12

範囲を使用するより簡潔なバージョンもあります。 @deals = Deal.where(開始:DateTime.now.beginning_of_day .. DateTime.now.end_of_day) –

+0

「Deal.where(start:Time.zone.now.midnight)」も機能しています。 –

23

のRails 5.1が与えられた日付の範囲オブジェクトを返しますDate#all_dayヘルパーを、導入しているので、あなただけ書くことができます。

Deal.where(start: Date.today.all_day) 

あなたはまた、あなたの目標、例えばのためのSQL DATE()機能を使用することができます。

まだRailsの4上の方のため
@deals = Deal.where('DATE(start) = ?', Date.today) 
2

上記not_a_patchの答えを強化するために、私は使用します。

Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) 

DateTime.nowはありませんがTime.zoneは(あなたの日付時刻フィールドが格納されている方法です)UTCを使用しますので。

> DateTime.now 
=> Fri, 08 Sep 2017 11:28:21 -0400 
> Time.zone.now 
=> Fri, 08 Sep 2017 15:29:53 UTC +00:00