使用Rails、MySQL和Active Record查询今天的日期。

19

我在Active Record的文档中看到,你可以使用大于/小于比较来查询日期。但是,如果您想选择日期等于今天的记录,是否必须查询日期大于昨天并且小于明天?

正如您在以下查询中所看到的,我正在执行类似的操作,并且查询日期等于今天返回了一个空集合。

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 

这是查询今天日期的正确方法吗?还是我漏掉了什么?

3个回答

45

1
谢谢!感谢您指出DUP。也许对于那些希望在activerecord / Ruby中明确书写的人来说,这个问题仍然有用。 - jdkealy
这对我起作用了。 - Jose Kj

14
我认为以下帖子更适合您参考: 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)

这将获取已应用时区转换的结果。 如果有更好的解决方案,请让我知道。


我认为这个答案没有得到足够的关注。我已经使用DATE()有一段时间了,只是偶然在测试时发现了这种行为。现在我必须回去确保我的代码的每个部分仍然表现正常。 - Tikiboy
同意这可能是更好的方法,考虑到时区。 - Dhanush Balachandran

0

对我来说就是这样运作的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接