【问题标题】:Find users created during a specific hour range (any day)查找在特定时间范围内(任何一天)创建的用户
【发布时间】:2015-02-09 18:04:33
【问题描述】:

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

【问题讨论】:

  • 试试这个,User.where(created_at: Time.parse("2pm")..Time.parse("5pm"))

标签: mysql ruby-on-rails ruby


【解决方案1】:

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. 您可以在整个代码中重复使用它,而不必担心位置或时间范围的语法。
  2. 如果出于某种奇怪的原因,rails 决定为此更改接口,您只需编辑一个方法,而不是在整个项目的一千个地方编写代码。
  3. 如果您觉得 user.rb 变大,您可以轻松地将这段代码移出 user.rb。也许对于一些专门的查找器或查询类。或者类似repository pattern

PS:时间函数可能在不同的 DBMS(如 MySQL、Postgresql、MSSQL 等)之间有所不同。我不知道是否有通用的方法来做到这一点。此答案适用于 MySQL。

【讨论】:

  • 这真的有效吗? Time.parse("2pm") 在我的系统上返回 2015-02-09 14:00:00,因此您的代码返回在今天下午 2 点到 5 点之间创建的用户。
  • 你是对的。我没有读到它应该在任何一天工作。我会相应地改变我的答案。
  • 谢谢米兰——这是一个很好的、干净的、(就像你说的)干的答案。
【解决方案2】:

试试这个,

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

或者类似的东西

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

【讨论】:

  • 把这个#each改成#select就完美了。
  • @hakcho - 感谢您的更正,我没有尝试代码
  • 再次检查select 的文档,不是我的意思。
  • 我认为您无需在select 之前提及all,因为它会获取整个数据库。还有一件事甚至不需要初始化数组,因为它只在数组中返回
  • 你的第一行真的有效吗? Time.parse("2pm") 在我的系统上返回 2015-02-09 14:00:00,因此您的代码返回在今天下午 2 点到 5 点之间创建的用户。
【解决方案3】:

要返回在任何一天两小时内创建的用户,请使用以下命令:

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

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

【讨论】:

  • 同样适用于时间:TIME(created_at) BETWEEN "14:00" AND "17:00"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多