我必须导入不带时区信息的数据在其中(但是,我知道我要导入的数据的具体时区),但我需要timestamp with time zone
数据库中的格式。一旦我导入它并将时间戳数据类型设置为timestamp with time zone
,Postgres会自动假设表中的数据来自我的时区,并将我的时区分配给它。不幸的是,我想要导入的数据不是来自我的时间范围,所以这不起作用。
该数据库还包含不同时区的数据。但是,一张表中的时区始终相同。
现在,我可以在导入数据之前将数据库的时区设置为我要导入的数据的时区(使用SET time zone
命令)并在导入完成后将其更改回我的时区,并且我非常确定已经存储的数据不会受到数据库时区更改的影响。但这似乎是一种非常肮脏的方法,并且可能会在以后引起问题。
我想知道是否有一种更优雅的方法来指定导入的时区,而无需在数据本身中包含时区数据?
另外,我还没有找到导入后编辑时区信息的方法。有没有一种方法不进行转换,而是简单地编辑整个表的时区,假设整个表具有相同的时区偏移量(即,如果在数据输入/导入时分配了错误的时区偏移量)?
Edit:
我设法在导入时指定时区,整个命令是:
set session time zone 'UTC';
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
set session time zone 'CET';
然后使用会话时区导入数据。我认为这对同时从其他连接对数据库进行的任何其他查询没有影响?
Edit 2:
后来我发现如何更改表的时区:
PostgreSQL 更新时区偏移 https://stackoverflow.com/questions/6492657/postgresql-update-time-zone-offset?rq=1
我认为在导入后更改表的时区然后使用会话临时更改本地时区会更优雅。当然,假设整个表具有相同的时区。
所以现在的代码应该是这样的:
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
UPDATE tbl SET <tstz_field> = <tstz_field> AT TIME ZONE '<correct_time_zone>';