Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查找在特定时间范围内(任何一天)创建的用户_Mysql_Ruby On Rails_Ruby - Fatal编程技术网

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

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

为了好玩,我想看看在特定的时间范围内(具体来说是凌晨2点到5点)创建的用户集(在Rails数据库中),但任何一天都可以。他们都有典型的现场创作。我想我知道如何从这个字段中为一个用户提取小时,然后看看它是否在某个范围内——但是我如何为所有用户提取小时呢?我是不是应该循环一下?(就在我写这篇文章的时候,这听起来很幼稚)。

试试这个

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
这为您提供了几个好处:

  • 您可以在整个代码中重用它,而不必担心where或time范围的语法
  • 如果出于某种奇怪的原因rails决定为此更改接口,那么您只需要编辑一个方法,而不需要在整个项目的上千个地方编写代码
  • 如果您觉得user.rb变得很大,那么可以轻松地将这段代码移出user.rb。可能是某个专门的查找器或查询类。或者是一个类似

  • 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
    
    这为您提供了几个好处:

  • 您可以在整个代码中重用它,而不必担心where或time范围的语法
  • 如果出于某种奇怪的原因rails决定为此更改接口,那么您只需要编辑一个方法,而不需要在整个项目的上千个地方编写代码
  • 如果您觉得user.rb变得很大,那么可以轻松地将这段代码移出user.rb。可能是某个专门的查找器或查询类。或者是一个类似

  • 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”之间。