Прежде всего, вам нужно понять, что такое «вчера в 14:00», и я бы перевел:
DateTime.now.yesterday.beginning_of_day.change(:hour => 14)
Многие из опубликованных здесь решений предлагают добавить 14 часов к началувчера, но это неправильно. Помните, летнее время !Что безопаснее, так это просто изменить час на соответствующее значение.
Нет 24 часов в день.Есть 23, 24 и 25 в зависимости от того, какой сегодня день.Чтобы продемонстрировать это, рассмотрим переходные периоды летнего времени:
Time.zone = 'EST5EDT'
DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day + 14.hours
# => Sun, 11 Mar 2012 15:00:00 EDT -04:00
Это 3 часа дня, потому что с 1 до 2 утра не произошло.Используя change
, вы всегда должны получать правильные результаты:
DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day.change(:hour => 14)
# => Sun, 11 Mar 2012 14:00:00 EDT -04:00
Часто вы можете также использовать оператор BETWEEN
, чтобы упростить вычисления даты, но в вашем случае, так как вы выбираете между этой точкойвовремя и прямо сейчас, предполагая, что у вас нет событий в будущем, вы можете опустить один предел.Кроме того, ActiveRecord должен правильно обрабатывать форматирование значений DateTime при выполнении запросов, поэтому вызов strftime
часто бывает неэффективным, так как вы легко можете ошибиться.причина:
events.where("DATE(created_at) BETWEEN ? AND ?", DateTime.now.yesterday.beginning_of_day.change(:hour => 14), DateTime.now)
Имейте в виду, что обычно выгодно хранить время в вашей базе данных в формате UTC и выполнять преобразование из местного времени в UTC при выполнении запросов.Хранение испорченных значений часовых поясов в базе данных может создать много проблем, если вам нужно работать с несколькими часовыми поясами одновременно.