Rails ActiveRecord Data między

Muszę odpytywać komentarze w jeden dzień. Pole jest częścią standardowych znaczników czasu, jest created_at. Wybrana data pochodzi z opcji date_select. Jak Mogę używać ActiveRecord do tego celu?

I need somthing like:

"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'"
Author: user2262149, 2010-03-04

11 answers

Tylko zauważ, że aktualnie akceptowana odpowiedź jest przestarzała w Rails 3. Powinieneś to zrobić zamiast tego:

Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)

Lub, jeśli chcesz lub musisz użyć Pure string conditions , możesz to zrobić:

Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day)
 337
Author: ndbroadbent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 18:26:45

Osobiście stworzyłbym scope, aby uczynić go bardziej czytelnym i nadającym się do ponownego użycia:

W komentarzu.rb, można zdefiniować zakres:

scope :created_between, lambda {|start_date, end_date| where("created_at >= ? AND created_at <= ?", start_date, end_date )}

Następnie do zapytania utworzonego pomiędzy:

@comment.created_between(1.year.ago, Time.now)
Mam nadzieję, że to pomoże.
 38
Author: Marshall Shen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 16:32:26

Ten kod powinien działać dla ciebie:

Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})

Aby uzyskać więcej informacji, zajrzyj do obliczenia czasu

Uwaga: Ten kod jest przestarzały . Użyj kodu z odpowiedzi, jeśli używasz Rails 3.1 / 3.2

 20
Author: Irukandji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-15 23:37:11

Rails 5.1 wprowadził nową metodę helpera date all_day, Zobacz: https://github.com/rails/rails/pull/24930

>> Date.today.all_day
=> Wed, 26 Jul 2017 00:00:00 UTC +00:00..Wed, 26 Jul 2017 23:59:59 UTC +00:00

Jeśli używasz Rails 5.1, zapytanie będzie wyglądało następująco:

Comment.where(created_at: @selected_date.all_day)
 13
Author: Bismark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-26 18:31:09

Uruchomiłem ten kod, aby sprawdzić, czy sprawdzona odpowiedź działa, i musiałem spróbować zamienić daty, aby to zrobić dobrze. To zadziałało --

Day.where(:reference_date => 3.months.ago..Time.now).count
#=> 721

Jeśli myślisz, że wynik powinien być 36, rozważ to, Sir, ile dni to 3 dni dla 3 osób?

 8
Author: boulder_ruby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-05 01:45:12
Comment.find(:all, :conditions =>["date(created_at) BETWEEN ? AND ? ", '2011-11-01','2011-11-15'])
 6
Author: kaushal sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-24 06:01:52

Używałem 3 kropek zamiast 2. Trzy kropki dają zakres, który jest otwarty na początku i zamknięty na końcu, więc jeśli wykonasz 2 zapytania dla kolejnych zakresów, nie możesz uzyskać tego samego wiersza z powrotem w obu.

2.2.2 :003 > Comment.where(updated_at: 2.days.ago.beginning_of_day..1.day.ago.beginning_of_day)
Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" BETWEEN '2015-07-12 00:00:00.000000' AND '2015-07-13 00:00:00.000000')
=> #<ActiveRecord::Relation []> 
2.2.2 :004 > Comment.where(updated_at: 2.days.ago.beginning_of_day...1.day.ago.beginning_of_day)
Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" >= '2015-07-12 00:00:00.000000' AND "comments"."updated_at" < '2015-07-13 00:00:00.000000')
=> #<ActiveRecord::Relation []> 
I tak, zawsze miło jest używać lunety!
 5
Author: nroose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-28 10:26:53

Jeśli chcesz dostać tylko jeden dzień, byłoby łatwiej w ten sposób:

Comment.all(:conditions => ["date(created_at) = ?", some_date])
 4
Author: klew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 18:54:37

Jest kilka sposobów. Możesz użyć tej metody:

start = @selected_date.beginning_of_day
end = @selected_date.end_of_day
@comments = Comment.where("DATE(created_at) BETWEEN ? AND ?", start, end)

Lub to:

@comments = Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
 4
Author: ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-21 12:46:38

Powinno być domyślne zachowanie active record. Wyszukiwanie dat jest trudne, zwłaszcza w przypadku stref czasowych.

W każdym razie używam:

  scope :between, ->(start_date=nil, end_date=nil) {
    if start_date && end_date
      where("#{self.table_name}.created_at BETWEEN :start AND :end", start: start_date.beginning_of_day, end: end_date.end_of_day)
    elsif start_date
      where("#{self.table_name}.created_at >= ?", start_date.beginning_of_day)
    elsif end_date
      where("#{self.table_name}.created_at <= ?", end_date.end_of_day)
    else
      all
    end
  }
 4
Author: Augustin Riedinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 15:58:55

Możesz użyć poniższego klejnotu, aby znaleźć zapisy między datami,

Ten klejnot jest dość łatwy w użyciu i bardziej przejrzysty by star używam tego klejnotu, a API jest bardziej przejrzyste i dobrze wyjaśnione.

Post.between_times(Time.zone.now - 3.hours,  # all posts in last 3 hours
                  Time.zone.now)

Tutaj możesz również przejść nasze Pole Post.by_month("January", field: :updated_at)

Proszę zapoznać się z dokumentacją i spróbować.

 1
Author: Jenorish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 12:57:18