Запрос где 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
Является ли это правильным способом запроса на сегодняшний день или я что-то не хватает?
Ответы
Ответ 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)