查找在特定小时范围内(任何一天)创建的用户

时间:2015-02-09 08:37:16

标签: mysql ruby-on-rails ruby

为了好玩,我希望看到在特定小时范围内(凌晨2点 - 凌晨5点)创建的用户集(在Rails数据库中),但是在任何一天。它们都具有典型的created_at字段。我想我知道如何从这个字段中为一个用户提取小时,然后查看它是否属于某个范围 - 但我如何为所有这些做到这一点?我应该绕过它们吗? (即使我写它,这听起来很幼稚)。

3 个答案:

答案 0 :(得分:4)

Sontyas的第一部分回答是rails中的简单解决方案。 但是,我会将这一部分移到你的类中,将你的代码与框架分开一点。

# app/models/user.rb
class User < ActiveRecord::Base
# ...
  def self.get_users_created_between(start_time, end_time)
    User.where("TIME(created_at) BETWEEN TIME(?) AND TIME(?)", start_time, end_time)
  end
# ...
end

并像这样使用它:

irb> User.get_users_created_between(Time.parse("2pm"), Time.parse("5pm"))

这为您提供了以下几个好处:

  1. 您可以在代码中重复使用它,而无需担心where或time范围的语法。
  2. 如果由于一些奇怪的原因,rails决定更改此接口,您只需编辑一个方法,而不是在整个项目的一千个地方编码。
  3. 如果您认为user.rb变大,您可以轻松地将这段代码移出user.rb。也许去一些专门的查找器或查询类。或者类似于repository pattern
  4. PS:时间函数可能因MySQL,Postgresql,MSSQL等不同的DBMS而异。我不知道,如果有通用方法可以做到这一点。这个答案适用于MySQL。

答案 1 :(得分:1)

试试这个,

User.where(created_at: Time.parse("2pm")..Time.parse("5pm"))

或类似的东西

User.select { |user| user.created_at.hour.between?(2, 5) }

答案 2 :(得分:1)

要返回在任何指定日期创建两小时之间的用户,请使用:

User.where('HOUR(created_at) BETWEEN ? AND ?', 2, 5)

请注意HOUR(created_at)仅适用于MySQL。 Postgresql中的语法是SQLite中的extract(hour from timestamp created_at)strftime('%H' created_at)