1

我按照 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”的值,则它被正确插入。

有人知道发生了什么吗?

非常感谢。

4

1 回答 1

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,因为它没有做你想做的事。

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

于 2013-12-07T08:53:27.443 回答