2008-09-23 3 views
1

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

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

ответ

4

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

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

Edit:

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

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

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

0

Если вы хотите закрыть свои базы, убедитесь, что вы сохранили дату в utc и выберите стандарт iso. Такой подход требует минимальных усилий и защитит ваш код от будущих головных болей. Я согласен с @skymt ISO 8601 является хорошим выбором.

0

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

0

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

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

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

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

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

Смежные вопросы