2015-04-09 6 views
3

Мы конвертируем временные метки в эпоху, делаем некоторые математические данные, а затем преобразуем их обратно в метки времени. Часовой пояс в базе: TIMESTAMP WITHOUT TIME ZONE.Различные результаты для эпохи экстракций на разных серверах PostgreSQL

С переходом на летнее время здесь во времена Великобритании на один час на одном сервере, а не на другой, так что я сделал небольшой тест:

SHOW SERVER_VERSION; 
SHOW TIMEZONE; 
SELECT extract(EPOCH FROM TIMESTAMP '1970-01-01'); 

На одном сервере я получаю

server_version 
---------------- 
9.1.15 
(1 row) 

TimeZone 
---------- 
GB 
(1 row) 

date_part 
----------- 
     0 
(1 row) 

Но с другой

server_version 
---------------- 
9.3.6 
(1 row) 

TimeZone 
---------- 
GB 
(1 row) 

date_part 
----------- 
    -3600 
(1 row) 

есть ли какие-либо параметры сервера, которые могут быть причиной этого?

Или изменилось поведение extract после Postgres 9.1?

+1

Догадка: попробуйте вынуть SELECT (EPOCH FROM TIMESTAMP '1970-01-01' :: временная метка с часовым поясом); ' –

+0

Обычно базой, которая имеет больше смысла в контексте вопроса, является' '1970-01 -01 ':: отметка времени в часовом поясе' GMT''. Извлечение эпохи из этого должно работать как ожидалось как в версиях до 9.2, так и после 9.2. –

ответ

5

Да, поведение extract изменено в PostgreSQL версии 9.2. От the release notes:

  • Сделать EXTRACT(EPOCH FROM timestamp without time zone) Измерить эпохальное с полуночи, а не в полночь UTC (Tom Lane)

    Это изменение возвращается Необдуманная изменения, сделанные в версии 7.3. Измерение с полуночи UTC было непоследовательным, потому что оно делало результат зависимым от установки timezone, вычислений для timestamp without time zone не должно быть. Предыдущее поведение остается доступным путем ввода входного значения в timestamp with time zone.

Это может быть то, что вызывает разницу, потому что согласно the docs,

Стандарт SQL требует, чтобы писать просто timestamp быть эквивалентно timestamp without time zone и PostgreSQL отличием, что поведение.

В @unique_id предполагает, используя timestamp with time zone (а.к.а. timestamptz) следует удалить несоответствие.

+0

Спасибо, используя ':: timestamp с часовым поясом', поскольку предлагаемый @unique_id дает мне -3600 на обоих серверах. Мы возвращаемся к отметкам времени после некоторых вычислений, поэтому все это скорее похоже на SELECT to_timestamp (extract (EPOCH FROM TIMESTAMP '1970-01-01' :: timestamp с часовым поясом)) :: timestamp без часового пояса'. Пробовал несколько других вещей и 'extract (EPOCH FROM TIMESTAMP '1970-01-01' AT TIME ZONE 'UTC')' также, похоже, работает. – peterwimsey

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