如何编写一个activerecord查询,它只查看datetime字段的时间组件



是否可以只查看datetime字段的时间组件的activerecord查询?

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

查找在早上6点到晚上12点之间开始的所有战斗,而不管它们发生在哪一天?在这个例子中,start_time被定义为一个日期时间

唯一的方法是使用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属性的战斗模型之前设置此值。

编辑

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

相关内容

  • 没有找到相关文章

最新更新