Подтвердить что ты не робот

Запрос где date = Date.today с Rails, MySQL и Active Record

Я вижу в документах Active Record, вы можете запросить дату, используя большее или меньшее, чем сравнение. Однако, что, если вы хотите выбрать, где date = Date.today, или я должен запросить, где дата больше, чем вчера и меньше, чем завтра?

Как вы можете видеть, я делаю именно это в следующих запросах и запросах, где Date = сегодня возвращает пустой набор

1.9.3p286 :096 > Subscription.where("created_at = ?", Date.today).count
   (0.5ms)  SELECT COUNT(*) FROM `subscriptions` WHERE (created_at = '2013-01-18')
 => 0 

против.

1.9.3p286 :098 > Subscription.where("expiration_date < ? AND expiration_date > ?", Date.today + 1, Date.today - 1).count
   (0.4ms)  SELECT COUNT(*) FROM `subscriptions` WHERE (expiration_date < '2013-01-19' AND expiration_date > '2013-01-17')
 => 1 

Является ли это правильным способом запроса на сегодняшний день или я что-то не хватает?

4b9b3361

Ответ 1

Я думаю, что это DUP этого вопроса:

Как выбрать дату из столбца datetime?

Subscription.where("DATE(created_at) = ?", Date.today).count

Я уверен, что это работает в MySQL и PostgreSQL, но я не уверен, что это стандарт SQL.

Википедия, кажется, думает, что TO_DATE будет стандартом: http://en.wikipedia.org/wiki/SQL#Date_and_time

Это не работало для меня в PostgreSQL, хотя.

Ответ 2

Я считаю, что следующая публикация более релевантна для вас Rails ActiveRecord Поиск/Поиск по дате

В вашем случае, когда вы выполняете поиск по дате с помощью activerecord, вы можете принять во внимание временные преобразования.

Когда вы используете метод ниже

Subscription.where("DATE(created_at) = ?", Date.today).count

он использует функцию Mysql DATE для анализа даты, и вы получите время UTC, как сохранено в Mysql, с помощью activerecord. Если ваше приложение rails использует какой-либо другой часовой пояс, вы получите неправильные результаты.

Правильный способ использования этого - избежать использования каких-либо SQL-функций и вместо этого использовать диапазон.

Subscription.where(created_at: Date.today.beginning_of_day..Date.today.end_of_day)

Это приведет к получению результатов с использованием преобразований часового пояса. Пожалуйста, дайте мне знать, что у вас есть лучшее решение для этого.

Ответ 3

Для меня это работает только так:

@fisrt_payment_day = Invoice.where("DATE(date_first_payment) >= ?", Date.today - 1.day)