В PostgreSQL используется своя внутренняя таблица временных зон (postgresql-x.x.x/src/timezone), поэтому обновление системной базы zoneinfo не повлияет на перевод часов в PostgreSQL.Смотрим текущее состояние:
SELECT * FROM pg_timezone_names;
Europe/Moscow | MSK | 03:00:00 | f
Как видим часы перевелись и используется смещение +3 вместо +4.
SELECT now();
2011-11-01 11:00:19.834213+03SELECT now()-'6 days'::interval;
2011-10-26 11:00:52.155833+04Копируем актуальные данные из обновлённой в системе базы часовых поясов. База часовых поясов в PostgreSQL может оказаться в /usr/local/share/pgsql/timezone, /usr/share/pgsql/timezone или /usr/local/pgsql/share/timezone/. Например:
cp -f /usr/share/zoneinfo/Europe/Moscow /usr/share/pgsql/timezone/Europe/Moscow
После этого "SELECT * FROM pg_timezone_names" отобразит изменения, но чтобы они подействовали обязательно требуется перезапустить PostgreSQL.Для изменения часового пояса для конкретной БД можно использовать конструкцию:
ALTER DATABASE mydb SET timezone TO 'Asia/Yekaterinburg';
Из других подводных камней, которые обнаружились при отмене перехода на зимнее время можно упомянуть забытое обновление /etc/localtime в chroot-окружениях.
URL:
Обсуждается: https://www.opennet.ru/tips/info/2639.shtml
>ALTER DATABASE mydb SET timezone TO >'Asia/Yekaterinburg';Это несколько хард коддинг.
psql можно указать смещение временной зоны относителельно UTC:
SET TIMEZONE TO "+4";
По-моему, это у тебя хардкодинг. :)
А в статье нормальное решение.
а через полгода опять назад?
Почему? Через полгода в Екатеринбурге что-то опять изменится?
неделю назад по Asia/Yekaterinburg было летнее время, а через полгода не будет?
> psql можно указать смещение временной зоны относителельно UTC:
> SET TIMEZONE TO "+4";Ага и потерять все переключения часовых поясов в прошлом.
Странно,
SELECT * FROM pg_timezone_names;
Europe/Moscow | MSK | 04:00:00 | f
Это значит час. пояс правильный стоит?
# uname -a
Linux postgres 2.6.38-gentoo-r6 #3 SMP Tue Jun 7 22:35:12 YEKST 2011 x86_64 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz GenuineIntel GNU/Linux
# postgres=# select version();
PostgreSQL 8.4.7 on x86_64-pc-linux-gnu, compiled by GCC x86_64-pc-linux-gnu-gcc (Gentoo 4.4.5 p1.2, pie-0.4.5) 4.4.5, 64-bit
(сие под 1с-ку заточено)
Хотя кажется, что правильность часового пояса на данные не влияет
Europe/Moscow | MSK | 04:00:00 | fDebian testing
ЧЯДНТ?
Сидишь на testing.
В stable всё намного хуже
> Сидишь на testing.
> В stable всё намного хужеПоправка: чтобы понять всю досадную не справедливость жизни, выполни:
select '2011-11-04 00:00:00 MSK'::timestamptz
так что не так в статье?
или в у меня в postgresql?
2011-11-04 01:00:00+04Сколько должно быть ?
2011-11-04 00:00:00+04
у меня тоже чтото в postgresql не так ?
смена ТЗ в системе, вызвала смену в PGpostgres=# SELECT * FROM pg_timezone_names where name like '%Moscow%';
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Moscow | MSK | 04:00:00 | f
(1 row)postgres=# select version();
version
---------------------------------------------------------------------------------------------------------------
PostgreSQL 9.1.0 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit
(1 row)
небольшое уточнение, этот совет полезен только тем у кого собран pgsql без опции --with-system-tzdata=DIR
если опция присутствует, то и так всё поправится
Автору огромное спасибо!
Хотелось бы только отметить, что копировать файлы зон приходится от рута, и (в случае с сервером 1С) лучше для большей безопасности сначала остановить сервис 1С, потом postgresql, и потом уже скопировать правильный файл и запустить сервисы в обратной последовательности.