如何编写仅查看日期时间字段的时间组件的activerecord查询?

时间:2011-07-25 03:16:31

标签: ruby-on-rails ruby-on-rails-3 datetime activerecord time

是否可以执行仅查看日期时间字段的时间组件的activerecord查询?

e.g。 Battle.where('start_time < ? and start_time > ?','12:00','06:00')

发现在上午6点到下午12点之间开始的所有战斗,不管他们发生的那一天?在此示例中,start_time被定义为日期时间。

1 个答案:

答案 0 :(得分:6)

执行此操作的唯一方法是使用SQL函数,如果您使用的是MySQL,则可以这样做:

Battle.where( 'HOUR( start_time ) >= ? AND HOUR( start_time ) <= ?', 12, 6 )

但这非常低效,并且总是会产生全表扫描,你肯定不希望这样。

最佳解决方案是在战斗模型中添加仅包含小时值的列,将其编入索引并直接在其上查询,如下所示:

Battle.where( 'start_time_hour >= ? start_time_hour <= ?', 12, 6 )

只需添加一个before_save回调,在基于start_time属性保存Battle模型之前设置此值。

修改

顺便说一句,如果你正在使用PostgreSQL,它能够在函数结果上创建一个索引,所以,如果你不介意坚持使用PostgreSQL,你可以只使用SQL函数。在你问之前,不,我不知道它是如何工作的,我只知道数据库允许你这样做,而且这在MySQL上不可用。