Rails Sql查询MONTH和YEAR

问题描述

| 我正在尝试在索引视图中显示当前月份和年份的销售交易。 这是我放入销售控制器中的内容
def index
 @sales = show_sales_for_current_month(@sales)
在SalesHelper中使用此方法
def show_sales_for_current_month(sales)
  sales = Sale.find(:all,:conditions => [\"MONTH(date) = ? AND YEAR(date) =?\",Date.today.month,Date.today.year])
end
其中date是日期数据类型。 但我收到以下控制器错误
sqlite3::sqlException: no such function: MONTH: SELECT \"sales\".* FROM \"sales\" WHERE (MONTH(date) = 4 AND YEAR(date) =2011)
我环顾了帖子,看来这是正确的功能,所以我在做什么错呢?谢谢!     

解决方法

在MySQL中,这可行,但是您使用的是SQLite3,因此您需要修改查询以使用MONTH和YEAR的SQLite3版本,这意味着使用strftime函数:
sales = Sale.find(:all,:conditions => [\"strftime(\'%m\',date) = \'?\' AND strftime(\'%Y\',date) = \'?\'\",\'%02d\' % Date.today.month,Date.today.year])
    ,嘿,我有一个名为by_star的gem,可以帮助您进行此类查询。在您的情况下,您只需要在控制器中执行以下操作:
@sales = Sale.by_month
by_star负责计算月份和年份以及凌乱的SQL。     ,SQLite3中不存在MONTH和YEAR函数。您可以采用这种方法(摘自我当前的项目): 模型entry.rb:
  def self.all_entries_year(year,user_id)
    where(\'entries.user_id = :id\',:id => user_id ).
    where(\':first_day <= entries.date AND entries.date <= :last_day\',{ 
        :first_day => Date.new(year,1,1),:last_day => Date.new(year,12,31)
    }).
    order(\'date desc\')
  end
编辑: 将其放在您的模型中:sales.rb(我想它具有字段日期)
def self.show_sales_for_current_month(year,month)

  mydate = Date.new(year,month,1)

  where(\':first_day <= sales.date AND sales.date <= :last_day\',{ 
        :first_day => mydate,        :last_day => mydate.at_end_of_month
  }).
  order(\'date\')
end