我按照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',则会正确插入。
有人知道发生了什么吗?
非常感谢。
答案 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,因为它没有做你想要的。
看起来这里可能存在解析问题。现在我已经确定了一个,我不确定我会相信那里没有更多。