Хранение календарного дня в базе данных sqlite - PullRequest
1 голос
/ 23 сентября 2008

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

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

Ответы [ 4 ]

4 голосов
/ 23 сентября 2008

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

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

Edit:

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

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

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

0 голосов
/ 24 сентября 2008

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

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

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

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

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

0 голосов
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

...