Последовательная обработка DateTimes в разных СУБД

Я планирую распределенную систему приложений, которая будет взаимодействовать с различными типами СУБД. Одно из требований - согласованная обработка DateTimes во всех типах СУБД. Все значения DateTime должны иметь точность до миллисекунды, включать информацию о часовом поясе и храниться в одном столбце.

Поскольку разные СУБД обрабатывают дату и время по-разному, я беспокоюсь, что не могу полагаться на их собственные типы столбцов в этом случае, и поэтому мне придется придумать другое решение. (Если я ошибаюсь, вы можете указать мне дорогу.)

Решение, каким бы оно ни было, в идеале должно обеспечивать простую сортировку и сравнение на уровне SQL. Другие аспекты, такие как удобочитаемость и возможность использования функций SQL datetime, не важны, поскольку все это будет обрабатываться службой шлюза.

Я пытаюсь сохранить свои значения DateTime в столбце типа unsigned largeint (8 байтов). Я не удостоверился, что все рассматриваемые СУБД (MSSQL, Oracle, DB2, PostgreSQL, MySQL, возможно, некоторые другие) действительно / имеют / такой тип, но на данный момент я просто предполагаю, что они есть.

Что касается формата хранения ... Например, 2009-01-01T12: 00: 00.999 + 01: 00 может храниться аналогично? 20090101120000999 ??, который занимает менее 8 байт.

Минимальное значение DateTime, которое я мог бы сохранить таким образом, было бы 0001-01-01T00: 00: 00.000 + xx: xx, а максимальное - 8000-12-31T23: 59: 59.999 + xx: xx, что дает мне пролета более чем достаточно.

Поскольку максимальное значение unsigned largeint равно 18446744073709551615, это оставляет мне следующие 3 цифры (отмеченные A и BB) для хранения информации о часовом поясе: AxxxxxxxxxxxxxxxxxBB.

Принимая во внимание максимальный годовой промежуток 0001..8000, A может быть 0 или 1, а BB может быть от 00 до 99.

А теперь вопросы:

  • Что вы думаете о предложенном мной решении? Есть ли в этом заслуги или это просто глупо?

  • Если лучшего способа не существует, как вы предлагаете наилучшим образом использовать три оставшиеся цифры для информации о часовом поясе?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
331
1

Ответы 1

Я предлагаю вам хранить информацию о дате и времени в миллисекундах с 1970 года (стиль Java). Это стандартный способ хранения информации о дате и времени, кроме того, он более эффективен с точки зрения места, чем ваше предложение. Потому что в вашем предложении некоторые цифры "потрачены впустую", т.е. цифры месяца могут хранить только 00-12 (вместо 00-99) и так далее. Вы не указали, какой у вас язык разработки, но я уверен, что вы можете найти множество фрагментов кода, которые преобразуют дату в миллисекунды. Если вы разрабатываете в .NET, у них аналогичная концепция клещей. (вы также можете использовать эту информацию)

Что касается часового пояса, я бы добавил еще один столбец для хранения только индикации часового пояса.

Помните, что любой выбранный вами формат должен поддерживать согласованность между двумя датами, т.е. если D1> D2, то формат (D1)> формат (D2), таким образом вы можете запросить БД на предмет изменений с некоторой даты или запросить изменения между двумя датами.

Num. миллисекунд с 1970 года означает использование 6 байтов для текущих значений DateTime, что по эффективности точно такое же, как и предложенные мной 8 байтов, независимо от потраченных впустую цифр. По поводу вашего последнего абзаца, касающегося согласованности и запросов ... Считаете ли вы, что предлагаемое мной решение их не покрывает? Спасибо

aoven 09.01.2009 15:07

Как сделать 6 байтов такими же, как 8 байтов. Что касается вашего вопроса, я не совсем понял, для чего нужна первая цифра? Потому что он определит результат сравнения двух дат.

LiorH 09.01.2009 18:24

Ну, я не знаю ни одного числового столбца, который занимал бы 6 байтов. Это либо 4 (int), либо 8 (largeint), ничего между ними. Так что, если что-то занимает 5 или 6 байт, вам все равно нужно использовать largeint. Что касается первой цифры: вы правильно подметили. Я думаю, это автоматически исключает это.

aoven 09.01.2009 22:58

Другие вопросы по теме