【发布时间】:2020-10-27 09:36:17
【问题描述】:
我需要查找在一周中的特定日期创建的所有记录。 我只有标准模型日期时间时间戳。 我将如何在 activerecord 中执行此操作?
【问题讨论】:
-
Rails 2 还是 3?你的意思是特定的一天,例如24.11.2010 还是仅将“星期四”作为星期几?
标签: ruby-on-rails activerecord
我需要查找在一周中的特定日期创建的所有记录。 我只有标准模型日期时间时间戳。 我将如何在 activerecord 中执行此操作?
【问题讨论】:
标签: ruby-on-rails activerecord
跟进贾斯汀的回答
where("extract(dow from created_at) = ?", Date.today.wday)
这是我在我的 postgres 应用程序中使用的。这将找到与今天在同一天创建的所有记录。例如,如果今天是星期二,它将查找在星期二创建的所有记录。
【讨论】:
您可以在 MySQL 中使用 DAYOFWEEK 函数并将其传递给 :conditions 选项。假设您有一个名为 Item 的模型,这将返回周日创建的所有项目:
Item.all(:conditions => ['dayofweek(created_at) = ?', 1])
使用 Postgres,您可以使用 to_char 做类似的事情。
请注意,使用这样的函数可能会使数据库进行全表扫描,因为至少 MySQL 不支持向函数添加索引。如果您预计会经常这样做,您可能需要考虑将星期几提取到另一列。
【讨论】:
dayofweek 的问题是它将基于 UTC 时间。如果您在应用程序中使用另一个时区,则可能会出现不匹配的情况。不要使用 LOE 来更改 mysql 时区,或者如果那是个好主意。
获取自 Unix 纪元以来的秒数。 Time.to_i 在 Ruby 中执行此操作。
使用 7 的模数来获取星期几(0 到 6)。
dayOfWeek = (epochseconds / 86400 ) % 7;
【讨论】:
如果你不反对使用 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?
【讨论】: