我需要编写一个Postgres脚本来循环遍历特定表中的所有行,获取该行中的日期列,查找具有该日期的另一个表中的所有行,并为该行分配该行的ID其外键列中的第一行。进一步解释,我的数据(简化)如下:
first_table:
id INT, run_date DATE
第二张表:
id INT, target_date TIMESTAMP, first_table_id INT
伪代码:
first_table_array = SELECT * FROM first_table;
i, val = range first_table_array {
UPDATE second_table SET first_table_id={val.id} WHERE date={val.run_date}
}
但事实并非如此简单,因为我将日期与时间戳进行比较(我认为这会导致一些问题?),我也需要改进时间段。
所以我没有做date = {val.run_date},而是我需要检查日期是从凌晨4点开始的run_date,还是第二天凌晨4点。
所以说run_date是01/01/2015,我需要将该值转换为01/01/2015 04:00:00的时间戳,然后创建另一个时间戳01/02/2015 04:00:00 ,并做:
where date > first_date AND date < second_date.
所以,像这样:
伪代码:
first_table_array = SELECT * FROM first_table;
i, val = range first_table_array {
first_date = timestamp(val.run_date) + 4 hrs
second_date = timestamp(val.run_date + 1 day) + 4 hrs
UPDATE second_table SET first_table_id={val.id} WHERE date > first_date AND date < second_date
}
postgres是否能够做到这一点,或者我最好写一个脚本来做这件事?我是否需要使用循环,或者我可以使用连接和标准SQL查询来完成这些工作吗?
答案 0 :(得分:1)
我尽我所能。数据样本会很棒。
UPDATE second_table ST
SET ST.id = FT.id
FROM first_table FT
WHERE ST.date BETWEEN FT.run_date + interval '4 hour'
AND FT.run_date + interval '4 hour' + interval '1 day'
How to do an update + join in PostgreSQL?
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
注意:
BETWEEN
相当于使用<=
和>=