Как метка времени с часовым поясом читается в PostgreSQL? - PullRequest
0 голосов
/ 02 января 2019

Допустим, у меня есть временная метка с часовым поясом, хранящаяся в моей базе данных PostgreSQL.Примерно так:

2003-04-12 04:05:06.814191 America/New_York

При чтении этих данных будет ли база данных возвращать скорректированное время по Гринвичу для стандартизации всех прочитанных временных отметок или просто вернет это как есть?

ПричинаЯ задаю этот вопрос, я создал таблицу с записями, где каждая запись имеет столбец отметки времени.Я продолжал предоставлять разные часовые пояса для разных записей.Когда я запросил эту таблицу и попытался упорядочить по столбцу метки времени, часовой пояс, похоже, не повлиял на порядок.Это по замыслу?

Пример моих результатов:

1954-06-27 08:44:01.963454 Asia/Baghdad
1954-06-27 08:44:01.963454 GMT
1954-06-27 08:44:01.963454 Europe/Paris
1954-06-27 08:44:01.963454 Asia/Baghdad
1954-06-27 08:44:01.963454 America/New_York
1954-06-27 08:44:01.963454 America/New_York
1954-06-27 08:44:01.963454 America/New_York
1954-06-27 08:44:01.963454 GMT
1954-06-27 08:44:01.963454 America/New_York
1954-06-27 08:44:01.963454 America/New_York
1954-06-27 08:44:01.963454 Europe/Paris
1954-06-27 08:44:01.963454 America/New_York
1954-06-27 08:44:01.963454 Asia/Dhaka
1954-06-27 08:44:01.963454 GMT
1954-06-27 08:44:01.963454 GMT
1954-06-27 08:44:01.963454 Asia/Damascus
1954-06-27 08:44:01.963454 GMT
1954-06-27 08:44:01.963454 Asia/Damascus
1954-06-27 08:44:01.963454 America/New_York
1954-06-27 08:44:01.963454 Asia/Dhaka
1954-06-27 08:44:01.963454 Asia/Baghdad
1954-06-27 08:44:01.963454 Europe/Paris
1954-06-27 08:44:01.963454 Europe/Paris
1954-06-27 08:44:01.963454 Asia/Baghdad
1954-06-27 08:44:01.963454 Asia/Baghdad

Дата и время одинаковы для всех этих записей, и различные часовые пояса не влияли на порядок.

Чтобы было понятнее, я на самом деле храню эти временные метки в виде строк в столбце JSONb с именем data с ключом datetime, то есть:

data = {
    "datetime" : "2003-04-12 04:05:06.814191 America/New_York",
    .....
}

Во время упорядочения и фильтрации я используюэто как отметка времени.Как то так:

"(data->>'datetime')::timestamp"

1 Ответ

0 голосов
/ 02 января 2019

Тип PostgreSQL «timestamp with time zone» фактически не сохраняет смещение часового пояса в каждой записи.Он просто нормализует все до UTC внутри.

Точка «отметка времени с часовым поясом» заключается в том, что поскольку сохраненное значение представлено в известном часовом поясе, оно однозначно представляет конкретную точку ввремя.Альтернатива, «отметка времени без часового пояса», неоднозначна, потому что у нее есть время, но она не говорит о том, в какой зоне она находится - сегодня в записи может быть полдень, но разве это полдень в Гринвиче?Полдень в Нью-Йорке?Полдень в Токио?Тип «с часовым поясом» позволяет избежать этой проблемы, потому что зона всегда является гринвичской.

(Для сравнения: я считаю, что у Oracle есть «отметка времени с часовым поясом», которая фактически сохраняет смещение в каждой записи, и«временная метка с локальным часовым поясом», которая нормализует все в соответствии с часовым поясом сервера, чтобы избежать необходимости сохранять смещения для каждой записи. «Временная метка PostgreSQL с часовым поясом» названа как первая, но ведет себя как последняя.*

Однако, похоже, что вы на самом деле не храните «временную метку с часовым поясом» в своей таблице;вы, по сути, храните строку и преобразуете в timestamp как часть select.Ключевое слово timestamp само по себе относится к варианту «без часового пояса» (как того требует стандарт SQL), а в документации PostgreSQL говорится:

В литерале, который был определен как timestamp without time zone, PostgreSQL будет молча игнорировать любую индикацию часового пояса.Таким образом, результирующее значение получается из полей даты / времени во входном значении и не корректируется для часового пояса.

Я ожидаю, что то же самое относится и к приведению, хотя, если этов случае, если не совсем понятно, почему ваш вывод (timestamp значений) включает имена TZ.Но вы, вероятно, хотите вместо этого привести timestamptz или создать отдельный столбец timestamptz (чтобы значения могли быть проиндексированы).


Документация PostgreSQL о типах даты / времени хороший справочник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...