我有两个表如下,我想更新date_table的总字段和相应的time_table的总和(结束 - 开始)计算结果。
date_table
id name date total
1 xx 2016-02-01
2 yy 2016-02-02
time_table
id date_id start end
1 1 2016-02-01 08:00:00 2016-02-01 11:00:00
2 1 2016-02-01 14:00:00 2016-02-01 20:00:00
3 2 2016-02-02 08:00:00 2016-02-02 11:00:00
4 2 2016-02-02 14:00:00 2016-02-02 20:00:00
因此,结果将是date_table的第一个记录总数将是:
(2016-02-01 11:00:00 - 2016-02-01 08:00:00) + (2016-02-01 20:00:00 - 2016-02-01 14:00:00)
两个表格与date_id
是这样的吗?
Update date_table
SET date_table.total =
(
SELECT
sum(time_table.end - time_table.start)
FROM time_table
WHERE
date_table.id = time_table.date_id
)
不完全确定Postgres如何减去datetime?
答案 0 :(得分:0)
我认为total
中date_table
字段的数据类型为integer
,您的预期输出为
id name date total
-- ---- ---------- -----
1 xx 2016-02-01 9
2 yy 2016-02-02 9
所以,
select dteend-dtestart col
from time_table;
将生成输出为interval
数据类型
即
col
interval
--------
03:00:00
06:00:00
03:00:00
06:00:00
你不能直接在间隔上执行聚合函数。以下方法可以用来获取整数数据类型的区间。
select date_id, sum(EXTRACT(epoch FROM dteend-dtestart)/3600)::int
from time_table
group by date_id;
输出:
date_id sum
------- ---
1 9
2 9
并且更新应该如下。
UPDATE date_table
SET total = t.sum
FROM (
SELECT date_id
,sum(EXTRACT(epoch FROM dteend - dtestart) / 3600)::INT
FROM time_table
GROUP BY date_id
) t
WHERE date_table.id = t.date_id;