Выбор ответа Middle Проектирование и нормализация обновлено

timestamp или timestamptz

Вопрос

Сервис работает с пользователями из разных часовых поясов. Какой тип взять для времени создания заказа в PostgreSQL?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: timestamptz: хранит момент (в UTC), показывает в зоне сессии. timestamptz описывает абсолютный момент: при вставке значение переводится в UTC, при чтении в зону сессии. timestamp без зоны это «часы на стене» без привязки, при разных зонах серверов и клиентов начинается путаница.

Варианты ответа

  1. timestamptz: хранит момент (в UTC), показывает в зоне сессииправильный ответ
  2. timestamp: он меньше и быстрее, чем timestamptz
  3. timestamptz, потому что он хранит исходный пояс клиента
  4. text в формате ISO 8601 с указанием зоны

Разбор

timestamptz описывает абсолютный момент: при вставке значение переводится в UTC, при чтении в зону сессии. timestamp без зоны это «часы на стене» без привязки, при разных зонах серверов и клиентов начинается путаница. Распространённое заблуждение: timestamptz не хранит исходную зону, только момент; если зона клиента нужна, её хранят отдельной колонкой. Оба типа занимают 8 байт. Текст ломает сравнения, индексы и арифметику дат.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.