Да. Есть варианты использования для TIMESTAMP WITHOUT TIME ZONE
.
- В обычных бизнес-приложениях этот тип будет использоваться только для:
- Бронирование будущих встреч
- Представление одного и того же времени суток в разных часовых поясах, например, в полдень 23-го числа в Токио и в Париже (два разных момента между часами, в одно и то же время суток)
- Для отслеживания моментов, определенных точек на временной шкале, всегда используйте
TIMESTAMP WITH TIME ZONE
, а не WITHOUT
.
TIMESTAMP WITHOUT TIME ZONE
значения не являются точкой на временной шкале, а не фактическими моментами. Они представляют приблизительное представление о потенциальных моментах, возможных точках на временной шкале в диапазоне около 26-27 часов (диапазон часовых поясов вокруг земного шара). Они не имеют реального смысла, пока вы не примените часовой пояс или смещение от UTC .
Пример: Рождество
Например, скажем, вам нужно записать начало праздников / праздников.
Table: holiday_
Column: year_ Type: SMALLINT
Column: description_ Type: VARCHAR
Column: start_ Type: TIMESTAMP WITHOUT TIME ZONE
Чтобы зафиксировать тот факт, что Рождество начинается после полуночи 25 декабря этого года, мы должны сказать, 2016-12-25 00:00:00
без какого-либо часового пояса. В начале дня Санты он посещает Окленд в Новой Зеландии сразу после полуночи, так как это одна из самых ранних ночей в мире. Затем он направляется на запад, как и в следующую полночь, вскоре достигнув Филиппин. Затем олени двигаются в западном направлении, достигая Индии в полночь, что происходит через несколько часов после этой полуночи в Окленде. Намного позже все еще полночь в Париже FR, и еще позже полночь в Монреале, Калифорния. Все эти посещения Санта-Клауса происходят в разные моменты времени , но все они происходили вскоре после полуночи, в каждую полночь каждого населенного пункта.
Поэтому запись 2016-12-25 00:00:00
без какого-либо часового пояса, как начало Рождества, является информативной и законной, но только смутно. Пока вы не скажете «Рождество в Окленде» или «Рождество в Монреале», у нас нет определенного момента времени. Если вы записываете фактический момент каждый раз, когда сани приземляются, вы должны использовать, TIMESTAMP WITH TIME ZONE
а не WITHOUT
тип.
Похоже на Рождество в канун Нового года. Когда нью-йоркский бал Таймс-сквер падает , люди в Сиэтле все еще пьют шампанское и готовят рога для вечеринки . И все же мы записали бы идею новогоднего момента как 2017-01-01 00:00:00
в TIMESTAMP WITHOUT TIME ZONE
. Напротив, если мы хотим записать, когда мяч упал в Нью-Йорке или когда люди в Сиэтле взорвали свои рога, мы бы вместо этого использовалиTIMESTAMP WITH TIME ZONE
(не WITHOUT
), чтобы записать эти реальные моменты, каждые три часа друг от друга.
Пример: заводские смены
Другим примером может быть запись политики, которая включает настенное время в разных местах. Скажем, у нас есть заводы в Детройте, Дюссельдорфе и Дели. Если мы скажем, что на всех трех фабриках первая смена начинается в 6 утра с перерыва на обед в 11:30, это можно записать какTIMESTAMP WITHOUT TIME ZONE
. Опять же, эта информация полезна неопределенным образом, но не указывает конкретный момент времени, пока мы не применим часовой пояс. Новый день наступает раньше на востоке. Таким образом, фабрика в Дели будет открыта первой в 6 часов утра. Через несколько часов фабрика в Дюссельдорфе начинает работу в 6 часов утра. Но фабрика в Детройте на самом деле не откроется еще через шесть часов, когда наступит ее 6 утра.
Сравните эту идею (о том, когда обычно начинается заводская смена) с историческим фактом, когда каждый заводской рабочий начал свою смену в определенный день. Часы - это реальный момент, фактическая точка на временной шкале. Таким образом, мы записали бы это в столбце типа, TIMESTAMP WITH TIME ZONE
а неWITHOUT
типа.
Так что да, есть законные варианты использования для TIMESTAMP WITHOUT TIME ZONE
. Но по моему опыту с бизнес-приложениями, они относительно редки. В бизнесе мы склонны заботиться о реальных моментах: когда фактический счет-фактура поступил, когда именно этот контракт вступил в силу, в какой момент была выполнена эта банковская транзакция. Поэтому в таких распространенных ситуациях нам нужен TIMESTAMP WITH TIME ZONE
тип.
Для получения дополнительной информации см. Мой ответ на аналогичный вопрос. Должен ли я хранить метки времени UTC или местное время для смен?
Postgres
Обратите внимание, что Postgres специально никогда не сохраняет информацию о часовом поясе, указанную при вставке временной метки.
TIMESTAMP WITH TIME ZONE
- Любой указанный часовой пояс или смещение, включенное во входные данные, используется для настройки значения на UTC и сохраняется. Переданная информация о зоне / смещении затем отбрасывается. Подумай
TIMESTAMP WITH TIME ZONE
как TIMESTAMP WITH RESPECT FOR TIME ZONE
.
- Вводимое в 12:00 полдень 7 марта этого года в Индии время суток будет скорректировано на UTC путем вычитания пяти с половиной часов: 6:30 утра.
TIMESTAMP WITHOUT TIME ZONE
- Любой указанный часовой пояс или смещение, включенное во входные данные, полностью игнорируется.
- Ввод 12:00 в полдень 7 марта этого года в Индии записывается как 12:00 7 марта этого года без корректировки.
Стандарт SQL практически не затрагивает вопросы типов данных и поведения даты и времени. Таким образом, база данных широко варьируется в обработке даты и времени.