使用Rails,MySQL和Active Record查询date = Date.today的位置

时间:2013-01-18 17:18:48

标签: ruby-on-rails-3 activerecord

我在Active Record文档中看到,您可以使用大于/小于比较来查询日期。但是,如果你想选择date = Date.today,或者我必须查询哪里的日期大于昨天而不是明天?

正如您所看到的,我在以下查询中正是这样做并查询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 

VS。

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 个答案:

答案 0 :(得分:32)

我认为这是这个问题的DUP:

How to select date from datetime column?

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

我很确定这适用于MySQL和PostgreSQL,但我不确定它是否是SQL标准。

维基百科似乎认为TO_DATE将成为标准: http://en.wikipedia.org/wiki/SQL#Date_and_time

虽然这在PostgreSQL中对我不起作用。

答案 1 :(得分:11)

我相信以下帖子对你更有意义 Rails ActiveRecord Find / Search by Date

在您的情况下,当您使用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)

这会在应用了时区转换的情况下获取结果。 请让我知道,任何人都有更好的解决方案。

答案 2 :(得分:0)

对我来说,就像这样:

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