带有求和条件的PostgreSQL查询

时间:2013-12-07 03:59:34

标签: sql postgresql

我有以下简化的postgresql表'费用':

          Table "public.fees"
id |           datetime          | fee         
---+-----------------------------+----
1  |  2013-10-17 09:11:00.138021 | 5
2  |  2013-10-17 09:15:02.848841 | 20

4  |  2013-10-18 09:17:40.784396 | 40
5  |  2013-10-18 09:29:21.789913 | 10
16 |  2013-10-18 09:39:38.308201 | 10

17 |  2013-10-19 09:40:09.507662 | 10
18 |  2013-10-19 09:40:14.310772 | 10

22 |  2013-10-20 09:54:37.183343 | 40

35 |  2013-10-21 10:32:28.619779 | 10
39 |  2013-10-21 10:34:50.830838 | 10

我想要一个像这样的SQL结果:

|   datetime   | feeSum                  
---------------+----
|  2013-10-17  | 25    
|  2013-10-18  | 60    
|  2013-10-19  | 20   
|  2013-10-20  | 40    
|  2013-10-21  | 20

将每天的费用加到feeSum。

我经常搜索并试试这个:

create view temp as
select datetime, fee  from fees
where
datetime::date>='2013-10-17' and
datetime::date<='2013-10-21';


do $$
    declare
        fromdate date := '2013-10-17';
        todate date := '2013-10-21';
    begin
        for d in fromdate..todate
        loop
            select sum(fee) as feeSum, d as datetime from temp
            where
            datetime::date=d;
        end loop;
    end;
$$;

但得到了错误:

ERROR:  invalid input syntax for integer: "2013-10-17"

我找不到如何定义日期变量。或者有另一种方法来获得我的结果吗?

1 个答案:

答案 0 :(得分:3)

我通常用日期投射来写日期常量:

DATE'2013-10-17' or '2013-10-17'::date

这将解决您的语法错误。

对于您的查询,您可以取消该过程并直接查询:

  SELECT datetime::date AS datetime,
         SUM(fee) AS feeSum
    FROM fees
   WHERE datetime::date BETWEEN '2013-10-17' AND '2013-10-21'
GROUP BY datetime::date

正如人们在评论中指出的那样,Postgres将在WHERE子句中对日期类型进行隐式转换。我倾向于使演员明确,但我不确定哪个系统会要求它。