пояс = MSK
Пн 01 ноя 2021 11:24:49 MSK
С строки инсертятся в базу, которая находится на этой же машине
SHOW timezone ;
>> Europe/Moscow
select now(), now()::timestamptz;
2021-11-01 11:26:27.477 +0300 2021-11-01 11:26:27.477 +0300
в БД приходит запрос на инсерт строки в данными 2021-11-01 08:57:00 в поле с типом данных timestampz, но залетает строка с данными 2021-11-01 11:57:00.000 +0300
Что мне нужно сделать/поменять, чтобы в получить 08:57 ?
NOW()::timestamp - without time zone вроде как либо select now(), (now() - interval '3 hour') as UTS_time;
Это не "строка в базе 2021-11-01 11:57:00.000 +0300", это время "2021-11-01 08:57:00 UTC" отображается у вас как 2021-11-01 11:57:00.000 +0300 Если вы хотите, чтобы это значение отображалось у вас в UTC -- сделайте set timezone UTC (или преобразуйте это значение в timestamp через таймзону UTC). Тип timestamptz, вопреки наименованию, не содержыт в себе таймзону. Это просто время (timestamp), которое, подразумевается, записано в UTC.
Допустим я меняю таймзону set timezone = 'Etc/UTC'; Но в своей настоящей таблице я все еще получаю 2021-11-01 11:57:00.000 +0300 а не 2021-11-01 08:57:00+00
Вполне вероятно, что это ошыбка вашэго клиента (который получает данные в бинарном виде и плюёт на серверные настройки). Используйте psql и более традицыонные API.
Либо вы просто что-то сделали не так (например, изменили таймзону в транзакцыи).
а что вы имеете ввиду под "более традиционные API" ?
Ну, то, что есть во всяком psycopg -- выдаст всё с учётом set timezone.
Всё у Вас соответствует ситуации, когда у вставляющего клиента timezone Etc/UTC (как вот тут https://t.me/pgsql/338673 ). Откуда она берётся — Вам виднее (т.е. найдите с использованием pg_settings / по последовательности настроек). > Но в своей настоящей таблице я все еще получаю Это одно и то же: > SELECT timestamptz '2021-11-01 11:57:00.000+0300' = timestamptz '2021-11-01 08:57:00+00' AS equal; equal ------- t
это вы про питоновскую библиотеку?
т.е. на сервере БД живет по UTC, а я коннекчусь с клиента(который живет по МСК) и получаю даты +3 часа я правильно понимаю, что строка 2021-11-01 11:33:57.670 +0300 - говорит о том, что на сервере эта дата равна 2021-11-01 11:33:57.670 +0300 МИНУС 3 ЧАСА, т.е. 08:33 ?
Я примерно про любую обычную библиотеку для распространённого ЯП -- питоновскую psycopg2, сишную libpq, и так далее.
1. Это говорит о том что эта дата 11:33 в часовом поясе MSK, либо же 08:33 в UTC. 2. Чему равна таймзона подключения, когда вы вставляете эту дату? 3. Почему вы пользуетесь в терминах питона naive датой времени без явного указания в каком часовом поясе эта дата-время находится?
У сервера, по сути, нет "своей" таймзоны. Точнее есть, но ипсользуется она только для записи времени в лог-файлах. Есть дефолтная таймзона для сэссии, которая легко меняется через SET TIMEZONE.
> т.е. на сервере БД живет по UTC Нет. Ни "серверных", ни "БД" timezones в PostgreSQL не существует. Есть только источники настроек для подключающихся сессий на этих уровнях (сервер (posgresql.conf и ALTER SYSTEM) → база данных и/или пользователь). Всё это, естественно, "перебивается", если клиент при подключении (в стартовых пакетах протокола) или явно (`set timezone = 'xxx';) указывает time zone. > я правильно понимаю Нет. Эта строка указывает универсальный момент времени, одинаковый для всех нас (независимо от сервера, БД и каких-либо настроек).
в postgresql.conf datestyle = 'iso, dmy' #intervalstyle = 'postgres' timezone = 'Etc/UTC'
это таймзона подключения по-умолчанию TimeZone (string) Sets the time zone for displaying and interpreting time stamps. The built-in default is GMT, but that is typically overridden in postgresql.conf; initdb will install a setting there corresponding to its system environment. See Section 8.5.3 for more information. https://www.postgresql.org/docs/14/runtime-config-client.html
Обсуждают сегодня