【问题标题】:Find all records that were created on a specific day of the week查找在一周中的特定日期创建的所有记录
【发布时间】:2020-10-27 09:36:17
【问题描述】:

我需要查找在一周中的特定日期创建的所有记录。 我只有标准模型日期时间时间戳。 我将如何在 activerecord 中执行此操作?

【问题讨论】:

标签: ruby-on-rails activerecord


【解决方案1】:

跟进贾斯汀的回答

where("extract(dow from created_at) = ?", Date.today.wday)

这是我在我的 postgres 应用程序中使用的。这将找到与今天在同一天创建的所有记录。例如,如果今天是星期二,它将查找在星期二创建的所有记录。

【讨论】:

    【解决方案2】:

    您可以在 MySQL 中使用 DAYOFWEEK 函数并将其传递给 :conditions 选项。假设您有一个名为 Item 的模型,这将返回周日创建的所有项目:

    Item.all(:conditions => ['dayofweek(created_at) = ?', 1])

    使用 Postgres,您可以使用 to_char 做类似的事情。

    请注意,使用这样的函数可能会使数据库进行全表扫描,因为至少 MySQL 不支持向函数添加索引。如果您预计会经常这样做,您可能需要考虑将星期几提取到另一列。

    【讨论】:

    • dayofweek 的问题是它将基于 UTC 时间。如果您在应用程序中使用另一个时区,则可能会出现不匹配的情况。不要使用 LOE 来更改 mysql 时区,或者如果那是个好主意。
    【解决方案3】:

    获取自 Unix 纪元以来的秒数。 Time.to_i 在 Ruby 中执行此操作。

    使用 7 的模数来获取星期几(0 到 6)。

    dayOfWeek = (epochseconds / 86400 ) % 7;
    

    【讨论】:

      【解决方案4】:

      如果你不反对使用 ruby​​,你可以试试这个。

      array.select { |arr| ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"].include?(arr.created_at.strftime('%A'))
      

      我最初尝试使用另一个答案中建议的dayofweek。 我遇到的问题是,我的 sql 服务器似乎使用的是 UTC 时间,而我的 rails 服务器使用的是美国东部。晚上 8 点之后创建的记录将被提取,而之前发生的记录将被视为前一天。

      这是另一个相关的问题: How to filter by day of week in Rails 4.2 and sqlite?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2021-05-06
        • 1970-01-01
        • 2011-01-31
        • 2023-04-10
        • 2018-09-28
        相关资源
        最近更新 更多