2013-11-08 3 views
1

Я выполнил инструкции, которые комментируются в документации по postgres для создания журналов в формате CSV, а затем создайте таблицу в базе данных с соответствующими полями (http://www.postgresql.org/docs/9.0/static/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-CSVLOG)ошибка при использовании postgres для вставки CSV с временной отметкой поля

содержание 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

Это работает: вставляет в postgreslog (log_time, session_id, session_line_num) значения ('2013-11-07 23: 04: 59.124 CET', 'a', 1); –

+0

Как создается таблица? – frlan

ответ

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, поскольку он не делает то, что вы хотите.

Похоже, здесь могут быть проблемы с синтаксическим разбором. Теперь, когда я определил один, я не уверен, что верю, что не будет больше.

Смежные вопросы