0

我们的 rails 3.2.8 应用程序中有发票表。我们要选择过期/未过期的发票。发票表中有 invoice_date(日期)和 credit_term(整数)。这个想法是,如果 invoice_date + credit_term (day) > Date.today,那么发票没有逾期。否则,发票逾期。这是想法(不工作的查询):

Invoice.where("invoice_date + credit_term.days > ?", Date.today)

在 SQL 查询中将 credit_term 天数添加到 invoice_date 的正确方法是什么?我们希望有一个独立于数据库的解决方案。非常感谢。

4

3 回答 3

2

MySQL (您没有指定您的 RDBMS)

Invoice.where("DATE_ADD(invoice_date, INTERVAL ? DAY) > ?", credit_term.days, Date.today)
于 2012-08-29T17:54:53.310 回答
1

为什么不在 ruby​​ 中处理日期呢?

 Invoice.where("invoice_date > ?", Date.today - credit_term)

这也可以使用 invoice_date 上的索引来运行查询,而如果您使用 MySQL(例如)将无法使用这样的索引Date_Add

您可能需要考虑使用Date.current(考虑Time.zone到)而不是Date.today(不考虑)

于 2012-08-29T18:21:51.873 回答
1

我绝不是 ActiveRecord 查询界面方面的专家,但我无法找到像您需要的东西这样的东西,没有(1)进行一些数据库更改或(2)“手动”过滤发票(通过 Ruby 代码)。

以下是您的选择:

  1. 除了拥有credit_term字段之外,您还可以:

    • 将其替换为due_date列,或者
    • 添加该due_date保留该列credit_term- 这不会破坏您现有的任何代码,并且,除非您收到超过 1 亿张发票,否则它不会损害您的生产数据库服务器。
  2. 您可以添加一个搜索器(例如Sphinx,通过thinking-sphinx gem),并为发票创建索引。使用正确定义的索引,您可以使用 Sphinx 的查询界面来查找符合您条件的发票(如果您想让我给您一个具体的例子,请告诉我,我会用它更新这篇文章)。这种方法具有以下优点:

    • 一点也不改变你的数据库。
    • 使用非常快速的搜索引擎,搜索数据必须每 24 小时重新索引一次。
  3. 您可以通过这样的 Ruby 代码“手动”找到所需的发票:

    invoices = []
    today = Date.today
    Invoice.find_each do |i|
      invoices << i if (i.invoice_date + i.credit_term) > today
    end
    

    使用find_each保证您正在批量获取记录——您没有获取整个表。

于 2012-09-01T12:15:16.470 回答