Вопрос

Мне нужно хранить элементы с календарной датой (только день, без времени) в базе данных sqlite.Как лучше всего представить дату в столбце?В качестве разумных альтернатив на ум приходят юлианские дни и секунды Unix.Если я выберу единицу измерения, отличную от дней, какое время должно быть?

Обновлять:Я знаю об ISO8601 и фактически использовал его для хранения даты в виде строки в формате ГГГГ-ММ-ДД для прототипа.Но для различных арифметических операций мне приходится внутренне конвертировать его в какое-то число, поэтому я предпочитаю сохранить число и просто преобразовать его в строку для отображения.В каких единицах должно быть это число, какого происхождения и, если единицы точнее дней, какое время суток следует использовать?

Это было полезно?

Решение

Если вы планируете передать дату внешнему инструменту или библиотеке, вам следует использовать любой ожидаемый формат.Время Unix, похоже, является лингва-франка цифрового горографии, поэтому оно является хорошим значением по умолчанию, если внешние обстоятельства не делают выбор за вас.

ИСО 8601 может представлять интерес.

Редактировать:

Но для различных арифметических операций мне приходится внутренне конвертировать его в какое-то число, поэтому я предпочитаю сохранить число и просто преобразовать его в строку для отображения.

Ах, это имеет смысл.Если ваша среда (.NET?Питон?В C++?) есть инструменты для обработки времени, лучше всего использовать их собственные единицы измерения и эпоху.Нет смысла переписывать все эти функции манипулирования датами;они сложнее, чем кажутся.В противном случае я бы использовал дни по местному (григорианскому?) календарю, начиная с разумной эпохи для вашего приложения.Будьте щедры: вам не нужна обратная ошибка 2000 года, когда вам внезапно понадобится обработать дату раньше, чем вы ожидали.

Время суток – полностью дело вкуса.Полночь кажется самым чистым выбором (все нули в полях часов, минут и секунд), но, поскольку она никогда не доходит до пользователя, это не имеет практического значения.На самом деле, это было бы хорошее место для пасхального яйца.

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

Если вы хотите охватить свои базы, убедитесь, что вы сохранили дату в формате utc и выбрали стандарт ISO.Этот подход требует минимальных усилий и защитит ваш код от будущих проблем с взаимодействием.Я согласен с @skymt ИСО 8601 это хороший выбор.

Если вы используете C++, то вам стоит обратить внимание на boost::date_time.

«Лучший» почти полностью зависит от того, откуда берутся даты (объекты NSDate, некоторые XML-каналы) и как ими манипулируют (просто сохраняются как есть, а не как данные).выполнить некоторые арифметические действия, например «дней до»).

Я не обязательно рекомендую это, но я написал приложение, которое также должно было хранить дату, но не время, в базе данных SQLite.Сначала я использовал два столбца: «Месяц» и «День», где «Месяц» определялся как количество месяцев с января 2000 года.Мне нужно было обеспечить наличие одной строки на дату, поэтому я определил уникальный индекс для этих двух столбцов, и оказалось, что обновления происходят ужасно медленно.

Во второй попытке я использовал аналогичную схему, но закодировал дату в одно число, используя нижние 5 битов для дня и оставшиеся верхние биты для месяца (опять же, с января 2000 года).Функции преобразования были:

Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date

Эта схема сохраняет числовой порядок дат и позволяет легко разбивать их на компоненты.Это имело смысл для моего приложения, поскольку я хранил данные ежемесячными порциями.Если по дате вы хотите найти следующую дату, эта схема может быть не самой лучшей, поскольку дата + 1 может быть недопустимой датой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top