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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
3 095
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

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

Zach 18.09.2008 09:24

Ах, в этом случае я могу просто сохранить его как несколько столбцов NULLABLE, по одному для года, месяца, дня, тогда у вас будет объект значения FlexibleDate, который их интерпретирует.

Aaron Jensen 18.09.2008 09:35

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

Да, мне по-прежнему нужны преимущества столбца datetime, например упорядочивание.

Zach 18.09.2008 09:35

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

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

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

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

Я считаю, что это излишне усложняет ситуацию. Будь проще.

Aaron Jensen 18.09.2008 09:38

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

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

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

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

Ответ принят как подходящий

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

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

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

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

У меня такое чувство, что в Rails это было бы проблематично, но в остальном это верное предложение.

Zach 18.09.2008 09:53

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

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

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

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

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