Rails Sql查询一年和一年

时间:2011-04-13 06:18:43

标签: sql ruby-on-rails date

我正在尝试在索引视图中显示当前月份和年份的销售交易 这就是我在销售控制器中的内容:

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)

我看过帖子,看起来这是正确的功能,所以我做错了什么?谢谢!

3 个答案:

答案 0 :(得分:4)

嘿那里,我有一个名为by_star的宝石可以帮助你解决这些问题。在您的情况下,您只需要在控制器中执行此操作:

@sales = Sale.by_month

by_star负责计算出它的月份和年份,以及凌乱的SQL。

答案 1 :(得分:3)

SQLite3中不存在MONTH和YEAR函数。您可以采取这样的方法(取自我当前的项目):

model 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

答案 2 :(得分:0)

在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])