postgres使用copy插入带字段时间戳的CSV时出错

时间:2013-11-08 00:01:12

标签: sql postgresql logging csv copy

我按照postgres文档中的注释说明将日志创建为CSV格式,然后在数据库中创建一个包含相应字段的表(http://www.postgresql.org/docs/9.0/static/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-CSVLOG

CSV的内容如下所示:

2013-11-07 23:07:31.524 CET,"postgres","postgres",5556,"::1:62188",527c0f1e.15b4,1,"idle",2013-11-07 23:07:26 CET,2/23,0,LOG,00000,"sentencia: DROP TABLE public.mytable",,,,,,,,,"pgAdmin III - Browser"

但是当我执行COPY指令时:

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

发生错误,表示带时区的类型时间戳的语法无效:

ERROR:  la sintaxis de entrada no es válida para tipo timestamp with time zone: «2013-11-07 23:04:59.124 CET»
CONTEXT:  COPY postgreslog, línea 1, columna log_time: «2013-11-07 23:04:59.124 CET»
********** Error **********
ERROR: la sintaxis de entrada no es válida para tipo timestamp with time zone: «2013-11-07 23:04:59.124 CET»
SQL state: 22007
Context: COPY postgreslog, línea 1, columna log_time: «2013-11-07 23:04:59.124 CET»

如果我使用例如PgAdminIII直接插入注册表,并且我将'log_time'列设置为'2013-11-07 23:07:31.524 CET',则会正确插入。

有人知道发生了什么吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

是否有效我认为您应该预先处理时间戳,以便首先使用显式偏移作为时区。当我在我的系统上尝试这个时区时,我看到了一些令人不快的惊喜。

foo=# select '2013-11-07 23:04:59.124 CET'::timestamp;

        timestamp        
-------------------------
 2013-11-07 23:04:59.124
(1 row)

这是预期但

foo=# select '2013-11-07 23:04:59.124 CET'::timestamptz;

        timestamptz         
----------------------------
 2013-11-07 14:04:59.124-08
(1 row)

这是错误的时区。

所以这不会做你想做的事。这似乎在ISO和Postgres日期样式下都忽略了时区。摆脱它并更改为固定的偏移量或从字段中删除时间戳。但无论哪种方式摆脱CET,因为它没有做你想要的。

看起来这里可能存在解析问题。现在我已经确定了一个,我不确定我会相信那里没有更多。