2013-09-06 4 views
1

Я ищу записи в пользовательской модели. Атрибуты поиска from_date, to_date будут использоваться для поиска записей в пользовательской модели на основе столбца created_at.Rails проблема с летней экономией при поиске

User model : (id, name, created_at) 

У меня есть следующие записи в базе данных.

id, name, created_at 
1 jd1 2013-09-04 18:01:57 
2 jd2 2013-09-05 19:01:57 
3 jd3 2013-09-05 23:01:57 

Когда я ищу, между "2013-09-04" .to_date (FROM_DATE) и "2013-09-05" .to_date (to_date), только первые две записи возвращаются. Последний не возвращается. Когда я изменяю to_date на «2013-09-06», отображается последняя запись. Это запрос, который я использовал.

date_range = from_date ... to_date + 1.day 
scope :by_date, ->(date_range) {where(created_at: date_range)} 

User.by_date(date_range) 

В чем проблема с запросом? Я думаю, что есть проблема с дневным часовым поясом.

+0

Вы должны CAST столбец created_at как дата, это на самом деле является DateTime;) – MrYoshiji

+0

Что такое производится фактический SQL? Я предполагаю, что вы выполняете преобразования часовых поясов между Rails и вашей базой данных. –

+0

@PhilipHallstrom Он производит следующий sql: SELECT 'users'. * FROM' users' WHERE ('users'.'created_at'> = '2013-09-04' AND' users'.created_at' <'2013-09 -06 ') – Kumar

ответ

1

Вы должны бросить свои поля created_at, как Дата:

CAST(users.created_at AS DATE) 

В ИНЕКЕ:

where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date1, date2) 

В вашем случае, с Вашей области:

scope :by_date, lambda{ |date_range| where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date_range.min, date_range.max) } 

Надежда это помогает!


Бонус: Короткая версия CAST, работает с Postgre SQL:

scope :by_date, lambda{ |date_range| where("users.created_at::date BETWEEN ? AND ?", date_range.min, date_range.max) } 
+0

Работал как шарм. Большое спасибо. – Kumar

+0

Возможно, у меня плохой день, но я не понимаю, почему исходный SQL (который имеет <'...-06') не работает, если это действительно проблема с часовым поясом, и указанные даты показывают местное время, но на самом деле «на следующий день» в UTC и каким-то образом превращаются в «день до» с кастингом. Исходный SQL, безусловно, работает в моей среде. –

Смежные вопросы