Так. Існують випадки використання для 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
без жодного часового поясу. Рано в день Санти він відвідує Окленд, штат Нью-Йорк, лише після півночі, оскільки це один із самих ранніх опівночі на земній кулі. Потім він просувається на захід, як це станеться наступної півночі, незабаром дістаючись до Філіппін. Потім північний олень рухається в західному напрямку, до півночі досягаючи Індії, що трапляється через кілька годин після цього опівночі Окленда. Набагато пізніше ще є опівночі в Парижі, а ще пізніше опівночі в Монреалі, Каліфорнія. Всі ці візити Діда Мороза трапляються в різні моменти - час , але все відбулося незабаром після півночі, за кожну власну півночі.
Тож запис 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 спеціально ніколи не зберігає інформацію про часовий пояс, вказану при вставці часової позначки.
TIMESTAMP WITH TIME ZONE
- Будь-який заданий часовий пояс або зсув, включений із вхідними даними, використовується для регулювання значення UTC та зберігається. Інформація про пройдену зону / зсув потім відкидається. Думай
TIMESTAMP WITH TIME ZONE
як TIMESTAMP WITH RESPECT FOR TIME ZONE
.
- 7 березня цього року в Індії в 12:00 в обід буде встановлено час часу, призначений для UTC, віднімаючи п'ять з половиною годин: 6:30 ранку.
TIMESTAMP WITHOUT TIME ZONE
- Будь-який вказаний часовий пояс або зміщення, включений до вхідних даних, повністю ігнорується.
- 7 березня цього року в Індії в 12:00 вночі записується як 12:00 7 березня цього року без коригування.
Стандарт SQL ледь не торкається питань типів даних та часу поведінки. Таким чином бази даних варіюються широко в обробці дати-часу.