我有以下简化的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"
我找不到如何定义日期变量。或者有另一种方法来获得我的结果吗?
答案 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子句中对日期类型进行隐式转换。我倾向于使演员明确,但我不确定哪个系统会要求它。