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





в своей модели обращайте внимание только на те детали, которые вам небезразличны. Таким образом, вы можете хранить всю дату в своей базе данных, но вы объединяете ее перед отображением пользователю.
Ах, в этом случае я могу просто сохранить его как несколько столбцов NULLABLE, по одному для года, месяца, дня, тогда у вас будет объект значения FlexibleDate, который их интерпретирует.
Неужели вообще необходимо хранить его как datetime? Если он не сохранен как строка 2008 или 2008-8 или 2008-8-1 - разделите строку на дефисы, когда вы ее вытаскиваете, и вы сможете установить, насколько конкретным был исходный ввод
Да, мне по-прежнему нужны преимущества столбца datetime, например упорядочивание.
Я бы, вероятно, сохранил дату и время и дополнительный столбец «точности», чтобы определить, как его выводить. Для вывода столбец точности может отображаться в столбец, содержащий соответствующую строку форматирования («ГГГГ-мм» и т. д.), Или он может содержать саму строку форматирования.
Дополнительный столбец можно просто использовать для указания, какая часть даты и времени была указана.
1 = день 2 = месяц 4 = год
Итак, 3 - это день и месяц, 6 - это месяц и год, 7 - это все три. это простой int в этот момент
Я считаю, что это излишне усложняет ситуацию. Будь проще.
Я не очень разбираюсь в дизайне БД, но я думаю, что чистый способ сделать это - использовать логические столбцы, указывающие, есть ли у пользователя месяц и день ввода (по одному столбцу для каждого). Затем, чтобы сохранить заданную дату, вы должны:
Таким образом вы узнаете, каким частям datetime вы можете доверять (т.е. что было введено пользователем).
Обновлено: это также было бы намного проще понять, чем иметь поле int с загадочными значениями!
По предложению Джензи, создайте битовую маску, чтобы показать, какие части даты были указаны. 1 = год, 2 = месяц, 4 = день, 8 = час (если вы решите уточнить), а затем сохраните это в другом поле.
Единственный способ, которым я мог придумать это без, требующий дополнительных столбцов в вашей таблице, - это использовать метод jhenzie с использованием битовой маски, а затем сохранить эту битовую маску в секундной части вашего столбца datetime.
База данных informix имеет такую возможность. При определении поля даты вы также указываете маску требуемых атрибутов времени и даты. При сравнении учитываются только эти поля.
С различными уровнями специфичности лучше всего хранить их как простые целые числа, допускающие значение NULL. Год месяц день. Вы можете инкапсулировать логику отображения в свою модель представления или объект значения в своем домене.
У меня такое чувство, что в Rails это было бы проблематично, но в остальном это верное предложение.
Встроенные типы времени представляют собой момент времени. Вы можете использовать встроенные типы и создать столбец для точности (год, месяц, день, час и т. д.), Или вы можете создать свою собственную структуру даты и использовать нули (или другое недопустимое значение) для пустых частей.
Если вы храните строку, не изобретайте частично стандарт ISO 8601, который охватывает описываемый вами случай и многое другое:
По крайней мере, для рубина - вы можете использовать этот драгоценный камень - частичная дата https://github.com/58bits/partial-date
Проблема в том, что у разных пользователей могут быть разные уровни специфичности - у кого-то только год, у кого-то месяц и день. Если это слишком много проблем, я могу пойти с этим.