powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Непонятки с CURRENT_DATE, CURRENT_TIME
8 сообщений из 8, страница 1 из 1
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40014555
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполняем
Код: sql
1.
2.
3.
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;

Получаем результат
Код: plaintext
1.
2.
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

Ещё один непонянный результат
Код: sql
1.
select CURRENT_TIMESTAMP - CURRENT_TIMESTAMP at time zone 'utc';

Получаем 10:00:00, т.е. 10 часов. В моём представлении CURRENT_TIMESTAMP и (CURRENT_TIMESTAMP at time zone 'utc) - это 2 различных представления одного момента времени. И я ожидал получить 0. Как по другому можно интерпретировать полученный результат?
...
Рейтинг: 0 / 0
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40014557
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury

Ещё один непонянный результат
Код: sql
1.
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
...
Рейтинг: 0 / 0
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40014631
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Поведение на обеих версиях одинаковое
...
Рейтинг: 0 / 0
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40014650
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury,

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


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40014909
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, да DBeaver подменяет параметром конфигурации timezone на локальную.
Но получается, что timezone применяется только к типу time, а к timestamp не применяется. Как-то не логично.
Спасибо, Maxim Boguk
...
Рейтинг: 0 / 0
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40014930
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40014943
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 тоже считают это нелогичным, но таков стандарт.
...
Рейтинг: 0 / 0
Непонятки с CURRENT_DATE, CURRENT_TIME
    #40015180
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 это абсолютная "временная метка" и недолжна быть подвержена каким либо скачкам локального времени.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Непонятки с CURRENT_DATE, CURRENT_TIME
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]