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