Rails Дата ActiveRecord между
Мне нужно запросить комментарии, сделанные за один день. Поле является частью стандартных временных меток, created_at
. date_select
дата исходит от date_select
.
Как я могу использовать ActiveRecord
для этого?
Мне нужно что-то вроде:
"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'"
Ответы
Ответ 1
Просто обратите внимание, что принятый в настоящее время ответ устарел в Rails 3. Вместо этого вы должны сделать это:
Comment.where(:created_at => @[email protected]_date.end_of_day)
Или, если вы хотите или должны использовать условия чистой строки, вы можете сделать:
Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day)
Ответ 2
Я лично создал область, чтобы сделать ее более читаемой и повторно используемой:
В вас Comment.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)
Надеюсь, что это поможет.
Ответ 3
Этот код должен работать для вас:
Comment.find(:all, :conditions => {:created_at => @[email protected]_date.end_of_day})
Для получения дополнительной информации взгляните на расчет времени
Примечание. Этот код устарел. Используйте код из ответа, если вы используете Rails 3.1/3.2
Ответ 4
В 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)
Ответ 5
Я запустил этот код, чтобы проверить, работал ли проверенный ответ, и ему пришлось попробовать поменять местами даты, чтобы все было правильно. Это сработало -
Day.where(:reference_date => 3.months.ago..Time.now).count
#=> 721
Если вы думаете, что на выходе должно быть 36, подумайте, сэр, сколько дней составляет от 3 дней до 3 человек?
Ответ 6
Comment.find(:all, :conditions =>["date(created_at) BETWEEN ? AND ? ", '2011-11-01','2011-11-15'])
Ответ 7
Я использую 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 []>
И да, всегда приятно использовать область!
Ответ 8
Если вы хотите только один день, это будет проще:
Comment.all(:conditions => ["date(created_at) = ?", some_date])
Ответ 9
существует несколько способов. Вы можете использовать этот метод:
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 => @[email protected]_date.end_of_day)
Ответ 10
При этом я должен учитывать поведение активной записи по умолчанию. Запросы даты трудны, особенно при использовании часовых поясов.
В любом случае, я использую:
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
}
Ответ 11
Вы можете использовать нижний камень для поиска записей между датами,
Этот драгоценный камень довольно прост в использовании и более ясен По звездам я использую этот драгоценный камень, а 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)
Пожалуйста, просмотрите документацию и попробуйте.