Mysql 查找在特定时间范围内(任何一天)创建的用户
为了好玩,我想看看在特定的时间范围内(具体来说是凌晨2点到5点)创建的用户集(在Rails数据库中),但任何一天都可以。他们都有典型的现场创作。我想我知道如何从这个字段中为一个用户提取小时,然后看看它是否在某个范围内——但是我如何为所有用户提取小时呢?我是不是应该循环一下?(就在我写这篇文章的时候,这听起来很幼稚)。试试这个Mysql 查找在特定时间范围内(任何一天)创建的用户,mysql,ruby-on-rails,ruby,Mysql,Ruby On Rails,Ruby,为了好玩,我想看看在特定的时间范围内(具体来说是凌晨2点到5点)创建的用户集(在Rails数据库中),但任何一天都可以。他们都有典型的现场创作。我想我知道如何从这个字段中为一个用户提取小时,然后看看它是否在某个范围内——但是我如何为所有用户提取小时呢?我是不是应该循环一下?(就在我写这篇文章的时候,这听起来很幼稚)。试试这个 User.where(created_at: Time.parse("2pm")..Time.parse("5pm")) 或者类似的事情 User.select { |u
User.where(created_at: Time.parse("2pm")..Time.parse("5pm"))
或者类似的事情
User.select { |user| user.created_at.hour.between?(2, 5) }
试试这个
User.where(created_at: Time.parse("2pm")..Time.parse("5pm"))
或者类似的事情
User.select { |user| user.created_at.hour.between?(2, 5) }
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
这为您提供了几个好处:
PS:时间函数在不同的DBMS之间可能会有所不同,比如MySQL、Postgresql、MSSQL等等。我不知道,是否有通用的方法可以做到这一点。这个答案是针对MySQL的。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
这为您提供了几个好处:
PS:时间函数在不同的DBMS之间可能会有所不同,比如MySQL、Postgresql、MSSQL等等。我不知道,是否有通用的方法可以做到这一点。此答案适用于MySQL。若要返回在任何给定日期两小时之间创建的用户,请使用以下命令:
User.where('HOUR(created_at) BETWEEN ? AND ?', 2, 5)
请注意,
HOUR(创建时间)
仅适用于MySQL。Postgresql中的语法是extract(从创建的时间戳开始的小时数)
和strftime(“%H”created_at)
。若要返回用户在任何给定日期创建的时间间隔为两小时,请使用以下命令:
User.where('HOUR(created_at) BETWEEN ? AND ?', 2, 5)
请注意,
HOUR(创建时间)
仅适用于MySQL。Postgresql中的语法是extract(创建时间戳的小时数)
和strftime(“%H”创建时间)
在SQLite中。试试这个,User.where(创建时间:Time.parse(“2pm”)…Time.parse(“5pm”))试试这个,User.where(创建时间:Time.parse(“2pm”)…Time.parse(“5pm”))将此#each
更改为#select
,它将是完美的。@hakcho-感谢您的更正,我没有再次尝试代码检查文档,这不是我的意思。我想您不必在选择之前提及所有
,因为它将去获取整个数据库。还有一件事甚至不需要初始化数组,因为它只返回数组。您的第一行实际工作吗?Time.parse(“2pm”)在我的系统上返回2015-02-09 14:00:00,因此您的代码返回今天下午2点到5点之间创建的用户。将此#each
更改为#select
,这将非常完美。@hakcho-感谢您的更正,我没有再次尝试代码检查文档,不是我的意思。我想你不必在选择之前提到全部
,因为它会去获取整个数据库。还有一件事甚至不需要初始化数组,因为它只返回数组。您的第一行实际工作吗?Time.parse(“2pm”)在我的系统上返回2015-02-09 14:00:00,因此您的代码返回今天下午2点到下午5点之间创建的用户。这实际有效吗Time.parse(“2pm”)
在我的系统上返回2015-02-09 14:00:00
,因此您的代码返回今天下午2点到下午5点之间创建的用户。您是正确的。我没有读到它应该在任何一天都能工作。我会相应地修改我的答案。谢谢米兰——这是一个好的、干净的、枯燥的答案。这真的有效吗Time.parse(“2pm”)
在我的系统上返回2015-02-09 14:00:00
,因此您的代码返回今天下午2点到下午5点之间创建的用户。您是正确的。我没有读到它应该在任何一天都能工作。我会相应地修改我的答案。谢谢米兰——这是一个好的、干净的(就像你说的)枯燥的答案。同样适用于时间:time(创建时间)在“14:00”和“17:00”之间。
同样适用于时间:time(创建时间)在“14:00”和“17:00”之间。