Postgres SQL根据另一个表的字段计算更新一个表列

时间:2016-02-06 03:03:19

标签: sql postgresql

我有两个表如下,我想更新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?

1 个答案:

答案 0 :(得分:0)

我认为totaldate_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;