172 похожих чатов

Всем привет! В чем моя проблема? Есть линукс сервер на котором часовой

пояс = 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 ?

16 ответов

12 просмотров

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.

Артур- Автор вопроса
Ilya Anfimov
Это не "строка в базе 2021-11-01 11:57:00.000 +03...

Допустим я меняю таймзону set timezone = 'Etc/UTC'; Но в своей настоящей таблице я все еще получаю 2021-11-01 11:57:00.000 +0300 а не 2021-11-01 08:57:00+00

Артур
Допустим я меняю таймзону set timezone = 'Etc/UTC'...

Вполне вероятно, что это ошыбка вашэго клиента (который получает данные в бинарном виде и плюёт на серверные настройки). Используйте psql и более традицыонные API.

Артур
Допустим я меняю таймзону set timezone = 'Etc/UTC'...

Либо вы просто что-то сделали не так (например, изменили таймзону в транзакцыи).

Артур- Автор вопроса
Ilya Anfimov
Вполне вероятно, что это ошыбка вашэго клиента (ко...

а что вы имеете ввиду под "более традиционные API" ?

Артур
а что вы имеете ввиду под "более традиционные API"...

Ну, то, что есть во всяком psycopg -- выдаст всё с учётом set timezone.

Артур
Допустим я меняю таймзону set timezone = 'Etc/UTC'...

Всё у Вас соответствует ситуации, когда у вставляющего клиента 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

Артур- Автор вопроса
Артур- Автор вопроса
Yaroslav Schekin
Всё у Вас соответствует ситуации, когда у вставляю...

т.е. на сервере БД живет по UTC, а я коннекчусь с клиента(который живет по МСК) и получаю даты +3 часа я правильно понимаю, что строка 2021-11-01 11:33:57.670 +0300 - говорит о том, что на сервере эта дата равна 2021-11-01 11:33:57.670 +0300 МИНУС 3 ЧАСА, т.е. 08:33 ?

Артур
это вы про питоновскую библиотеку?

Я примерно про любую обычную библиотеку для распространённого ЯП -- питоновскую psycopg2, сишную libpq, и так далее.

Артур
т.е. на сервере БД живет по UTC, а я коннекчусь с ...

1. Это говорит о том что эта дата 11:33 в часовом поясе MSK, либо же 08:33 в UTC. 2. Чему равна таймзона подключения, когда вы вставляете эту дату? 3. Почему вы пользуетесь в терминах питона naive датой времени без явного указания в каком часовом поясе эта дата-время находится?

Артур
т.е. на сервере БД живет по UTC, а я коннекчусь с ...

У сервера, по сути, нет "своей" таймзоны. Точнее есть, но ипсользуется она только для записи времени в лог-файлах. Есть дефолтная таймзона для сэссии, которая легко меняется через SET TIMEZONE.

Артур
т.е. на сервере БД живет по UTC, а я коннекчусь с ...

> т.е. на сервере БД живет по UTC Нет. Ни "серверных", ни "БД" timezones в PostgreSQL не существует. Есть только источники настроек для подключающихся сессий на этих уровнях (сервер (posgresql.conf и ALTER SYSTEM) → база данных и/или пользователь). Всё это, естественно, "перебивается", если клиент при подключении (в стартовых пакетах протокола) или явно (`set timezone = 'xxx';) указывает time zone. > я правильно понимаю Нет. Эта строка указывает универсальный момент времени, одинаковый для всех нас (независимо от сервера, БД и каких-либо настроек).

Артур- Автор вопроса
Yaroslav Schekin
> т.е. на сервере БД живет по UTC Нет. Ни "сервер...

в postgresql.conf datestyle = 'iso, dmy' #intervalstyle = 'postgres' timezone = 'Etc/UTC'

Артур
в postgresql.conf datestyle = 'iso, dmy' #interva...

это таймзона подключения по-умолчанию 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

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта