我在 Active Record 文档中看到,您可以使用大于/小于比较来查询日期。但是,如果您想选择 where date = Date.today 或者我必须查询 date 大于昨天且小于明天的情况该怎么办?
如您所见,我在以下查询中正是这样做的,并查询 Date = Today 返回一个空集
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
这是查询今天日期的正确方法还是我错过了什么?
我认为这是这个问题的DUP:
Subscription.where("DATE(created_at) = ?", Date.today).count
我很确定这适用于 MySQL 和 PostgreSQL,但我不确定它是否是 SQL 标准。
维基百科似乎认为
TO_DATE
将是标准:
http://en.wikipedia.org/wiki/SQL#Date_and_time
但这在 PostgreSQL 中对我来说不起作用。
我相信下面的帖子与您更相关 Rails ActiveRecord 按日期查找/搜索
在您的情况下,当您使用 activerecord 搜索日期时,您可能需要考虑时区转换。
当您使用以下方法时
Subscription.where("DATE(created_at) = ?", Date.today).count
它使用Mysql的DATE函数来解析日期,您将获得ActiveRecord保存在Mysql中的UTC时间。如果您的 Rails 应用程序使用其他时区,您将得到错误的结果。
正确的使用方法是避免使用任何 SQL 函数,而是使用范围。
Subscription.where(created_at: Date.today.beginning_of_day..Date.today.end_of_day)
这将获取应用时区转换的结果。 请让我知道您是否对此有更好的解决方案。
对我来说就是这样工作的:
@fisrt_payment_day = Invoice.where("DATE(date_first_payment) >= ?", Date.today - 1.day)
借助 Active Support 的 #all_day 扩展,您可以让它变得非常好。
Subscription.where(created_at: Date.today.all_day)