Rails日期后的含义是什么?

13

我需要在Rails模型时间戳 (created_atupdated_at) 上执行查询,找到指定日期后的所有记录。在执行查询时:

Item.where("created_at > :date OR updated_at > :date", date: "2011-05-29")
> SELECT "items".* FROM "items" WHERE (created_at > '2011-05-29' OR updated_at > '2011-05-29')

它包括像这样的记录:

attributes: 
  created_at: 2011-05-29 16:07:10.664227
  updated_at: 2011-05-29 16:07:10.664229

然而,这个日期并不比指定的日期大。有没有简单的方法来修复这个查询?谢谢。

编辑:

我也尝试过:

Item.where("created_at > :date OR updated_at > :date", date: "2011-05-29 16:07:10")

然而,使用相同的结果时,加上秒分数戳会给出正确的结果。

4个回答

21

假设你想要从5月30日开始的记录:

那么就搜索 >= 2011-05-30 00:00:00 的记录:

some_date = Time.now
Item.where("created_at >= :date OR updated_at >= :date", date: some_date.tomorrow.beginning_of_day)

3
你可以使用我的宝石 by_star 来完成这个操作。
Post.after(date)

3
我认为问题在于created_at和updated_at是日期时间类型,如果你只传递一个日期,它会默认将时间设置为00:00:00,因此任何大于该时间的记录都会被显示出来。所以你看到的记录都是在那个日期之后的,因为小时数更大。
请检查你的精度,你可以传递1天以上的时间,我将显示任何超过那一天的记录,甚至可以再多一秒钟,或者直接传递23:59:59作为小时数。

datetime字段是否需要同时指定秒的小数部分?谢谢! - Kevin Sylvestre
不,我可能只会添加一整天,或者只是23:59:59,这两种方法都可以给您足够的精度。 - daniel

1

很遗憾,SQL 不同意你的观点:

mysql> SELECT '2011-05-30 12:00:00' > '2011-05-30';
+--------------------------------------+
| '2011-05-30 12:00:00' > '2011-05-30' |
+--------------------------------------+
|                                    1 |
+--------------------------------------+

对于比较日期和日期时间,MySQL有以下说明

日期值会被强制转换为日期时间类型,通过添加时间部分 '00:00:00'。


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