我必须导入数据,其中没有时区信息(但是,我知道要导入的数据的具体时区),但我需要数据库中的timestamp with time zone
格式。一旦我导入它并将时间戳记数据类型设置为timestamp with time zone
,Postgres将自动假定表格中的数据来自我的时区,并为其分配我的时区。不幸的是,我想导入的数据不是我的时间框架,所以这是行不通的。更改数据的时区值
该数据库还包含具有不同时区的数据。但是,一个表内的时区总是相同的。
现在,我可以在导入数据(使用SET time zone
命令)之前将数据库的时区设置为我要导入的数据的时区,并在导入完成后将其更改回我的时区,并且我很确定已存储的数据不会受到数据库时区更改的影响。但这似乎是一种非常肮脏的做法,可能会在稍后导致问题。
我不知道是否有一种更优雅的方式来指定导入的时区而不在数据本身中包含时区数据?
此外,我还没有找到一种方法来编辑导入后的时区信息。假设整个表具有相同的时区偏移量(即,如果在数据输入/输入时分配了错误的偏移量),是否有办法不进行转换,而只是编辑整个表的时区?
编辑:
我设法指定在导入时区,整个命令之中:
set session time zone 'UTC';
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
set session time zone 'CET';
的数据然后被使用会话时区进口。我认为这对其他连接同时对数据库上的任何其他查询都没有影响?
编辑2:
我发现了如何更改表的时区算账:
PostgreSQL update time zone offset
我想这是更优雅更改表的时区导入后即可使用会话暂时更改当地时区。假设整个表格当然有相同的时区。
因此,代码会沿着现在的路线的东西:
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
UPDATE tbl SET <tstz_field> = <tstz_field> AT TIME ZONE '<correct_time_zone>';
你如何执行你的进口?你不能在导入时指定时区吗? – ertx
感谢您的提示,我已经更新了我的帖子,但我不确定会在执行时在数据库中的其他进程上设置会话时区有什么样的效果? – harbun