Вы теряете информацию о часовом поясе, как только вы вызываете функцию DATE()
в вашем SQL.Необходимо помнить о двух вещах:
- Все в базе данных будет в формате UTC, а все включает результат
DATE()
. - Одиндата (то есть день) в вашем местном часовом поясе может легко пересекать две даты в UTC, поэтому вам нужно смотреть на всю метку времени (на с обеих сторон ), а не только на компоненты даты (UTC).
Примерно так должно работать:
now = Time.now
Entry.where('created_at between :start and :end and email = :email',
:start => now.beginning_of_day,
:end => now.end_of_day,
:email => email
)
Время должно быть автоматически конвертировано в UTC.Возможно, вы захотите обработать верхнюю границу немного по-другому;использование end_of_day
дает вам 23:59:59
, поэтому есть немного места для того, чтобы что-то проскользнуло в то, что вы хотите захватить.Вы можете обойти эту проблему, используя явный полуоткрытый интервал (а не закрытый интервал, который использует SQL between
), например:
now = Time.now
Entry.where('created_at >= :start and created_at < :end and email = :email',
:start => now.beginning_of_day,
:end => now.tomorrow.beginning_of_day,
:email => email
)