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

StackOverflow https://stackoverflow.com/questions/90246

Вопрос

Я хочу, чтобы пользователи указывали дату, которая может включать или не включать день и месяц (но будет иметь как минимум год). Проблема в том, что она хранится как дата и время в БД;недостающий день/месяц будут сохранены как значения по умолчанию, и я потеряю исходный формат и значение даты.

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

Надеюсь, я что-то упустил из виду и может быть есть более простой способ.

(Обратите внимание, что я использую Rails, если это имеет значение для решения.)

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

Решение

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

Единственный способ, которым я мог это сделать. без Требование дополнительных столбцов в вашей таблице означало бы использование метода jhenzie с использованием битовой маски, а затем сохранение этой битовой маски в секундной части вашего столбца datetime.

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

в вашей модели обращайте внимание только на те части, которые вам интересны.Таким образом, вы можете сохранить всю дату в своей базе данных, но вы объединяете ее перед отображением пользователю.

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

1 = день 2 = месяц 4 = год

Итак, 3 — день и месяц, 6 — месяц и год, 7 — все три.в этот момент это простой int

Если вы храните строку, не изобретайте частично заново стандарт ISO 8601, который охватывает описанный вами случай и многое другое:

http://en.wikipedia.org/wiki/ISO_8601

Действительно ли необходимо вообще хранить его как дату и время?Если он не сохранен как строка 2008, 2008-8 или 2008-8-1 - разделите строку на дефисы, когда вы ее вытаскиваете, и вы сможете установить, насколько конкретным был исходный ввод.

Я бы, вероятно, сохранил дату и время и дополнительный столбец «точности», чтобы определить, как его вывести.При выводе столбец точности может сопоставляться со столбцом, содержащим соответствующую строку форматирования («ГГГГ-мм» и т. д.), или может содержать саму строку форматирования.

Я мало что знаю о дизайне БД, но думаю, что проще всего это сделать с помощью логических столбцов, указывающих, вводит ли пользователь месяц и день (по одному столбцу для каждого).Затем, чтобы сохранить данную дату, вы должны:

  1. Сохраните дату, введенную пользователем, в столбце datetime;
  2. Установите логический столбец месяца, если пользователь выбрал месяц;
  3. Установите логический столбец дня, если пользователь выбрал день.

Таким образом, вы узнаете, каким частям даты и времени вы можете доверять (т.то, что ввел пользователь).

Редактировать:это также было бы гораздо легче понять, чем иметь int поле с загадочными значениями!

База данных Informix имеет такую ​​возможность.Когда вы определяете поле даты, вы также указываете маску желаемых атрибутов времени и даты.При сравнении учитываются только эти поля.

С различными уровнями специфичности лучше всего хранить их как простые целые числа, допускающие значение NULL.Год месяц день.Вы можете инкапсулировать логику отображения в своей модели представления или объекте значения в своем домене.

Встроенные типы времени представляют момент времени.Вы можете использовать встроенные типы и создать столбец для точности (Год, Месяц, День, Час и т. д.) или создать собственную структуру даты и использовать значения NULL (или другое недопустимое значение) для пустых частей.

По крайней мере, для Ruby — вы можете использовать этот драгоценный камень — частичная датаhttps://github.com/58bits/partial-date

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