Рельсы ActiveRecord дата между
Мне нужно запросить замечания, сделанные в один день. Поле является частью стандартных меток времени, created_at. Выбранная дата исходит из date_select. Как я могу использовать ActiveRecord для этого?
Мне нужно что-то типа:
"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'"
11 ответов:
просто обратите внимание, что в настоящее время принятый ответ устарел в Rails 3. Вы должны сделать это вместо:
Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
или, если вы хотите или должны использовать чисто строковые условия, вы можете сделать:
Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day)
Я бы лично создал область, чтобы сделать ее более читаемой и многоразовой:
в Вас прокомментировать.rb, вы можете определить область:
scope :created_between, lambda {|start_date, end_date| where("created_at >= ? AND created_at <= ?", start_date, end_date )}
затем для запроса, созданного между:
@comment.created_between(1.year.ago, Time.now)
надеюсь, что это помогает.
этот код должен работать для вас:
Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})
для получения дополнительной информации взгляните на расчеты времени
Примечание: этот код не рекомендуется. Используйте код из ответа, если вы используете Rails 3.1 / 3.2
Rails 5.1 представил новый вспомогательный метод даты
all_day
см.: 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
Если вы используете Rails 5.1, запрос будет выглядеть так:
Comment.where(created_at: @selected_date.all_day)
Я запустил этот код, чтобы увидеть, работает ли проверенный ответ, и должен был попробовать поменять даты, чтобы получить его правильно. Это сработало--
Day.where(:reference_date => 3.months.ago..Time.now).count #=> 721
Если вы думаете, что выход должен был быть 36, подумайте об этом, сэр, сколько дней составляет 3 дня для 3 человек?
Я использую 3 точки, а не 2. Три точки дают вам диапазон, который открыт в начале и закрыт в конце, так что если вы делаете 2 запроса для последующих диапазонов, вы не можете получить ту же строку обратно в обоих.
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 []>
и, да, всегда приятно использовать размах!
Если вы хотите получить один день было бы проще так:
Comment.all(:conditions => ["date(created_at) = ?", some_date])
есть несколько способов. Вы можете использовать этот метод:
start = @selected_date.beginning_of_day end = @selected_date.end_of_day @comments = Comment.where("DATE(created_at) BETWEEN ? AND ?", start, end)
или такой:
@comments = Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
там должно быть поведение активной записи по умолчанию на этом я считаю. Запрос даты трудно, особенно когда часовые пояса участвуют.
в любом случае, я использую:
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 }
вы можете использовать ниже драгоценный камень, чтобы найти записи между датами,
этот драгоценный камень довольно прост в использовании и более ясен звезд Я использую этот драгоценный камень и API более ясно и документация также хорошо объяснена.
Post.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours Time.zone.now)
здесь вы также можете пройти наше поле
Post.by_month("January", field: :updated_at)
пожалуйста, смотрите документацию и попробуйте.