按月份编号查找特定月份的所有记录(例如1 = 1月)

时间:2016-02-04 19:17:35

标签: ruby-on-rails postgresql activerecord

使用Rails 4.2,Ruby 2.1.7。 Postgresql 9.4

当我只有一个整数作为参数时,我想查找特定月份的所有记录。

e.g。 1 = 1月,2 = 2月

现在我有(start_time是我的datetime字段)

def self.by_month(month)
  where('extract(month from start_time) = ?', month)
end

生成的SQL查询是:

SELECT "jobs".* FROM "jobs" WHERE (extract(month from start_time) = 1)

1 个答案:

答案 0 :(得分:1)

更好的解决方案可能是使用一系列日期。 ActiveRecord将其转换为WHERE x BETWEEN y AND z,因为如果您有多年的记录,则提取月份可能会有歧义。

这样的事情:

def self.by_month(int)
  int = int - 1 # convert month from 1 to 0 based
  now = DateTime.now
  if int < (now.month + 1) # now.month is 1 based
    min = now.beginning_of_year + int.months
  else
    min = now.last_year.beginning_of_year + int.months
  end

  where(start_time: [min..(min.end_of_month)])
end

您的确切方法最终取决于您希望如何处理可能属于上一年或下一年的月份。

在某些情况下,让您的用户选择带日期输入的月份可能更有意义,以便您可以区分。