1

我有一个 PostgreSQL 查询,它按月汇总值,从日期中提取月份值:

SELECT vendors.name AS vendor, 
SUM(purchases.invoice_total) AS invoice_total, 
EXTRACT(MONTH FROM purchases.date) AS date 
FROM vendors, purchases 
WHERE purchases.vendor_id = vendors.id 
AND purchases.store_id = ? 
AND purchases.purchase_department_id = ? 
AND (purchases.date BETWEEN ? AND ?) 
GROUP BY vendor, EXTRACT(MONTH FROM purchases.date) 
ORDER BY vendor, date;

直接在 DB 控制台中执行查询后,我得到如下信息:

+------------------------------------+---------------+------+
| vendor                             | invoice_total | date |
+------------------------------------+---------------+------+
| Store 1                            |        448.56 |    1 |
| Store 1                            |        263.44 |    2 |
| Store 1                            |        939.47 |    3 |

使用 Rails 的find_by_sql功能时会出现问题。和值正确返回,但日期值返回为零vendorinvoice_total

#<Purchase date: nil, invoice_total: #<BigDecimal:85c75c8,'0.26344E3',18(18)>>

这是我的电话。我什至尝试过硬编码值,但什么都没有,但就像 Extract 函数不会在 Rails 中执行:

<% @purchasesSQL = Purchase.find_by_sql(["SELECT vendors.name AS vendor, SUM(purchases.invoice_total) AS invoice_total, 
    EXTRACT(MONTH FROM purchases.date) AS date 
    FROM vendors, purchases 
    WHERE purchases.vendor_id = vendors.id 
    AND purchases.store_id = ? 
    AND purchases.purchase_department_id = ? 
    AND (purchases.date BETWEEN ? AND ?) 
    GROUP BY vendor, EXTRACT(MONTH FROM purchases.date) 
    ORDER BY vendor, date;", @store.id, purchase_department.id, @start, @end])
%>

我已经进行了一些调试,并且我传递的值不是零也不是错误的。

4

1 回答 1

2

你说你有一个列date在你的Purchase模型表中(这是一个可怕的列 BTW 名称,使用类型名称作为列名只会导致痛苦和痛苦)。大概您的date专栏是 adatetimestamp。在你的Purchase.find_by_sql,你有这个:

EXTRACT(MONTH FROM purchases.date) AS date 

并将Purchase.find_by_sql尝试创建Purchase实例。因此,您提供Purchase了一个简单的数字并调用它datePurchase可能会注意到它有一date列并尝试将您的简单数字解析为完整的日期或时间戳。一个简单的数字不能以任何有意义的方式解析为日期或时间戳,因此它们可能都被转换为nil.

你有两件事要做:

  1. 将该date列重命名为其他名称,即不与任何关键字冲突的名称。
  2. 并希望解决您的直接问题,为您的月份编号使用不同的别名:

    EXTRACT(MONTH FROM purchases.date) AS month_number
    

    这应该为您提供month_number返回Purchase对象的方法。

于 2013-06-19T06:35:03.610 回答