PostgreSQL - 日期的过滤功能

时间:2017-07-31 13:28:44

标签: postgresql

我正在尝试使用PostgreSQL中的内置filter函数来过滤日期范围,以便仅对在此时间范围内的条目求和。 我无法理解为什么没有应用过滤器。 我正在尝试过滤所有上个月created_at日期的产品交易(因此在2017年6月创建的情况下)。

SELECT pt.created_at::date, pt.customer_id,
    sum(pt.amount/100::double precision) filter (where (date_part('month', pt.created_at) =date_part('month', NOW() - interval '1 month') and 
date_part('year', pt.created_at) = date_part('year', NOW()) ))

from 
    product_transactions pt
LEFT JOIN customers c
    ON c.id= pt.customer_id
GROUP BY pt.created_at::date,pt.customer_id

请查看我的预期结果(上个月每天的金额总和 - 如果当天的条目存在,则为每个customer_id)以及我从查询中获得的实际结果 - 使用date_trunc )。 预期结果:

created_at| customer_id | amount
2017-06-30    1           220.5
2017-06-28    15            34.8
2017-06-28    12          157
2017-06-28    48          105.6
2017-06-27    332         425.8
2017-06-25    1           58.0
2017-06-25    23          22.5
2017-06-21    14          88.9
2017-06-17    2           34.8
2017-06-12    87          250
2017-06-05    48          135.2
2017-06-05    12          95.7
2017-06-01    44          120

结果:

created_at| customer_id | amount
2017-06-30    1           220.5
2017-06-28    15            34.8
2017-06-28    12          157
2017-06-28    48          105.6
2017-06-27    332         425.8
2017-06-25    1           58.0
2017-06-25    23          22.5
2017-06-21    14          88.9
2017-06-17    2           34.8
2017-06-12    87          250
2017-06-05    48          135.2
2017-06-05    12          95.7
2017-06-01    44          120
2017-05-30    XX          YYY
2017-05-25    XX          YYY
2017-05-15    XX          YYY
2017-04-30    XX          YYY
2017-03-02    XX          YYY
2016-11-02    XX          YYY

实际结果为我提供了数据库中所有日期的总和,因此查询中没有应用日期时间框架,原因是我无法理解。我看到的日期既不是2017年6月也不是前几年。

1 个答案:

答案 0 :(得分:0)

使用date_trunc(..)功能:

SELECT pt.created_at::date, pt.customer_id, c.name,
    sum(pt.amount/100::double precision) filter (where date_trunc('month', pt.created_at) = date_trunc('month', NOW() - interval '1 month'))
from 
    product_transactions pt
LEFT JOIN customers c
    ON c.id= pt.customer_id
GROUP BY pt.created_at::date