2015-10-09 2 views
1

У меня есть два сервера postgresql - один работает локально на моем компьютере с Windows и один работает на бета-сервере linux.Postgresql now() возвращает неверное значение

Я бегу эту команду на обоих (при очень близко к тому же времени):

select current_setting('TIMEZONE'), now(); 

Локальный результат DB:

"US/Pacific";"2015-10-09 12:29:51.053-07" 

Бета результат DB:

"US/Pacific";"2015-10-09 12:23:00.121953-07" 

Как вы можете видеть, временные интервалы совпадают, но времени нет - время в локальной базе данных правильно, но время на Кажется, что сервер около 6 минут и 51 секунд медленный.

EDIT на основе ответов:

Кроме того, я проверил даты и раз на обеих операционных системах и оба являются правильными.

Выбор не является частью большой транзакции. Я использую pgAdmin для запуска только этих операторов. Кроме того, я запускал timeofday() с помощью функции now(), и они возвращали то же самое время, что и вызовы функции now().

Любая идея, как это происходит?

+0

PostgreSQL-версия (-ы)? Точная информация о версии из 'SELECT version()' пожалуйста. –

+0

'now()' отображает время в начале транзакции: подробнее см. Руководство: http://www.postgresql.org/docs/current/static/functions-datetime.html # FUNCTIONS-DATETIME-CURRENT –

ответ

1

Вы уверены, что вы указали текущую дату/время на ОС на обеих машинах? Похоже, что часы на них не «синхронизированы» ...

Кроме того, вы работаете, что «выбираете» внутри транзакции «длинный»? Функция «now()» всегда возвращает время «заморожено» в начале транзакции. Чтобы получить время работы внутри транзакции, используйте функцию timeofday().

+1

Лучше использовать стандартные написания - 'current_timestamp' для' now() 'и' clock_timestamp' для 'timeofday()'. –

0

Вы проверили даты на обеих машинах - но вы также проверили время? Лучший способ сохранить синхронизацию времени - использовать NTP для всех ваших компьютеров. Также, если вы не уверены в транзакциях, вы можете использовать timeofday() для получения текущего системного времени.

SELECT timeofday(); 
0

PostgreSQL непосредственно называет даты и времени процедуры основной операционной системы, чтобы получить временную метку, регулируя только для временной зоны (если необходимо) и эпоха - которая фиксируется.

Скорее всего, ваши часы на самом деле не синхронизированы между двумя хостами. Настройте синхронизацию сетевого времени. Проблема исчезнет. Если вы действительно уверены, что это так, проверьте вывод команды date +%H:%M:%S в системе unix и time /T в командной строке Windows. Действительно ли они одинаковы?

Если они отличаются от PostgreSQL, но не сообщается операционной системой и, вы настроили синхронизацию времени в сети, сообщите об ошибке в pgsql-bugs или проследуйте здесь. Но, пожалуйста, будьте уверены, что они действительно те же, и убедитесь, что синхронизация времени в сети активна и работает.

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