Как бы я сохранил дату, которая может быть частичной (то есть только год, может быть, месяц тоже), и вывел бы ее позже с той же спецификой? - PullRequest
3 голосов
/ 18 сентября 2008

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

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

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

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

Ответы [ 11 ]

9 голосов
/ 18 сентября 2008

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

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

3 голосов
/ 18 сентября 2008

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

2 голосов
/ 18 сентября 2008

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

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

2 голосов
/ 18 сентября 2008

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

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

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

0 голосов
/ 27 мая 2012

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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