Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
Kr_Yury
Member

Откуда: Киев, Украина
Сообщений: 244
Выполняем
select current_date, current_date at time zone 'utc' as current_date_utc, (now() at time zone 'utc')::date now_date,
       CURRENT_TIME, CURRENT_TIME at time zone 'utc' as current_time_utc, localtime as local_time,
       CURRENT_TIMESTAMP, CURRENT_TIMESTAMP at time zone 'utc', now() at time zone 'utc' now_time;
Получаем результат
current_date|current_date_utc   |now_date  |current_time|current_time_utc|local_time|current_timestamp  |timezone           |now_time           
------------|-------------------|----------|------------|----------------|----------|-------------------|-------------------|-------------------
2020-11-03|2020-11-02 14:00:00|2020-11-02| 02:12:23| 02:12:23| 02:12:23|2020-11-03 02:12:23|2020-11-02 16:12:23|2020-11-02 16:12:23
Из чего я делаю вывод, что CURRENT_DATE и CURRENT_TIMESTAMP содержат часовой пояс, а CURRENT_TIME не содержит, вопреки тому, что написано в документации.

Но ещё больше меня удивило значение current_date_utc. Мы видим, что тип значения у него timestamp, а я ожидал получить date

Ещё один непонянный результат
select CURRENT_TIMESTAMP - CURRENT_TIMESTAMP at time zone 'utc';
Получаем 10:00:00, т.е. 10 часов. В моём представлении CURRENT_TIMESTAMP и (CURRENT_TIMESTAMP at time zone 'utc) - это 2 различных представления одного момента времени. И я ожидал получить 0. Как по другому можно интерпретировать полученный результат?
2 ноя 20, 19:50    [22225256]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4396
Kr_Yury

Ещё один непонянный результат
select CURRENT_TIMESTAMP - CURRENT_TIMESTAMP at time zone 'utc';
Получаем 10:00:00, т.е. 10 часов. В моём представлении CURRENT_TIMESTAMP и (CURRENT_TIMESTAMP at time zone 'utc) - это 2 различных представления одного момента времени. И я ожидал получить 0. Как по другому можно интерпретировать полученный результат?


Вам очень поможет для понимания функция pg_typeof чтобы понимать какой тип в какой ситуации образуется...
в данном случае мы имеем
select pg_typeof(CURRENT_TIMESTAMP at time zone 'utc');
pg_typeof
-----------------------------
timestamp without time zone
(т.е. тут уже нет информации о timezone).

далее происходит следующее на самом деле
select CURRENT_TIMESTAMP::timestamp without time zone - CURRENT_TIMESTAMP at time zone 'utc';
и информации от timezones тут уже нет....

Аналогично

mboguk=# select pg_typeof(CURRENT_TIME);
pg_typeof
---------------------
time with time zone
(1 row)

mboguk=# select CURRENT_TIME;
current_time
-------------------
18:58:23.30797+02

как у вас получился CURRENT_TIME без timezone мне не ясно... у вас какая версия базы то?

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
2 ноя 20, 20:00    [22225259]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
Kr_Yury
Member

Откуда: Киев, Украина
Сообщений: 244
Maxim Boguk,
select pg_typeof(CURRENT_TIME);
тоже возвращает
pg_typeof
-------------------
time with time zone
Но CURRENT_TIME и CURRENT_TIME at time zone 'utc' показывает одинаковое значение. И здесь ошибки вероятно нет. Оба значения показываются для одной и той же time zone. Но есть такая хитрость: при выполнении из psql время показывается для time zone 'utc' , а при выполнении из DBeaver - для локальной time zone.
Версии Postgres 10.10 и 11.2. Поведение на обеих версиях одинаковое
2 ноя 20, 23:08    [22225356]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4396
Kr_Yury,

Так посмотрите что show timezone; в обоих случаях показывает.
Требуемую ему timezone - выставляет клиент при соединении с базой (и там у разных клиентов разное понимание что ставить бывает).
Т.е. timezone не что то жестко прибитое к серверу а то что клиент устанавливает при соединении, если клиент НИЧЕГО не установил - то используется серверная настройка.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
2 ноя 20, 23:58    [22225387]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
Kr_Yury
Member

Откуда: Киев, Украина
Сообщений: 244
Maxim Boguk, да DBeaver подменяет параметром конфигурации timezone на локальную.
Но получается, что timezone применяется только к типу time, а к timestamp не применяется. Как-то не логично.
Спасибо, Maxim Boguk
3 ноя 20, 16:24    [22225793]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4396
Kr_Yury
Maxim Boguk, да DBeaver подменяет параметром конфигурации timezone на локальную.
Но получается, что timezone применяется только к типу time, а к timestamp не применяется. Как-то не логично.
Спасибо, Maxim Boguk


тип timestamp он timestamp WITHOUT TIMEZONE
если с timezone надо то тип timestamptz (он же TIMESTAMP WITH TIMEZONE)

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
3 ноя 20, 16:50    [22225819]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1181
Kr_Yury
Но получается, что timezone применяется только к типу time, а к timestamp не применяется. Как-то не логично

Note
The SQL standard requires that writing just timestamp be equivalent to timestamp without time zone, and PostgreSQL honors that behavior.

https://www.postgresql.org/docs/current/datatype-datetime.html
Да, разработчики postgresql тоже считают это нелогичным, но таков стандарт.

Сообщение было отредактировано: 3 ноя 20, 17:08
3 ноя 20, 17:12    [22225837]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с CURRENT_DATE, CURRENT_TIME  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2201
Melkij
Kr_Yury
Но получается, что timezone применяется только к типу time, а к timestamp не применяется. Как-то не логично

Note
The SQL standard requires that writing just timestamp be equivalent to timestamp without time zone, and PostgreSQL honors that behavior.

https://www.postgresql.org/docs/current/datatype-datetime.html
Да, разработчики postgresql тоже считают это нелогичным, но таков стандарт.


a TIMESTAMP value that is continuous, non-ambiguous, has exactly 60 seconds per minute and does not repeat values over the leap second.
Другими словами TIME STAMP это абсолютная "временная метка" и недолжна быть подвержена каким либо скачкам локального времени.
4 ноя 20, 12:01    [22226173]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить