У нас есть таблица, заполненная данными из устаревшего отчета другой системы. Столбцы этой таблицы отражают ту же структуру отчета.
Вот сокращенная структура таблицы:
CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
REPORT_DATE DATE NOT NULL,
EVENT_ID BIGINT PRIMARY KEY NOT NULL,
START_HOUR TIMESTAMP WITHOUT TIME ZONE,
END_HOUR TIME WITHOUT TIME ZONE,
EXPECTED_HOUR TIME WITHOUT TIME ZONE
);
Мы проводим рефакторинг этой таблицы для работы с разными часовыми поясами разных клиентов. Новая структура будет выглядеть примерно так:
CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
REPORT_DATE DATE NOT NULL,
EVENT_ID BIGINT PRIMARY KEY NOT NULL,
START_HOUR TIMESTAMP WITH TIME ZONE,
END_HOUR TIME WITH TIME ZONE,
EXPECTED_HOUR TIME WITH TIME ZONE
);
Эти часовые поля представляют определенный момент времени в течение дня, представленный столбцом REPORT_DATE. Под этим я подразумеваю, что каждый столбец TIME представляет момент в течение дня, указанного в REPORT_DATE.
Некоторые другие моменты для рассмотрения:
- Мы не знаем, почему START_HOUR имеет формат TIMESTAMP в отчете, который мы получаем из прежней системы. Но мы импортируем данные так, как они приходят к нам.
- Поля в отчете отформатированы в соответствии с часовым поясом клиента, поэтому для рефакторинга этой таблицы нам нужно объединить часовой пояс клиента (у нас есть эта информация), чтобы правильно вставить временные метки / времена в UTC.
Но теперь к проблеме. Значение этих столбцов используется для многократного вычисления других значений в нашей системе, что-то вроде следующего:
START_HOUR - END_HOUR (the result of this operation is currently being casted to TIME WITHOUT TIME ZONE)
START_HOUR < END_HOUR
START_HOUR + EXPECTED_HOUR
EXPECTED_HOUR - END_HOUR
EXPECTED_HOUR < '05:00'
После некоторых исследований я обнаружил, что не рекомендуется использовать тип TIME WITH TIME ZONE
( Время Postgres с равенством часовых поясов ), и теперь я немного озадачен тем, каков наилучший способ рефакторинга этого таблица для работы с разными часовыми поясами и обработки различных операций с колонками, которые нам нужны.
Кроме того, я уже знаю, что безопасно вычесть два столбца типа TIMESTAMP WITH TIME ZONE
. Эта операция вычитания учитывает изменения летнего времени ( Вычитание двух столбцов типа timestamp с часовым поясом ), но как насчет других? И тот, который вычитает ВРЕМЯ из TIMESTAMP?.
А что касается рефакторинга таблицы, должны ли мы в любом случае использовать TIME WITH TIME ZONE
? Должны ли мы продолжать использовать TIME WITHOUT TIME ZONE
? Или лучше вообще забыть тип TIME
и объединить ДАТУ с ВРЕМЯ и изменить столбцы на TIMESTAMP WITH TIME ZONE
?
Я думаю, что эти вопросы связаны, потому что новые типы столбцов, которые мы выберем, будут определять, как мы будем работать со столбцами.