Подтвердить что ты не робот

Хранение дня и месяца (без года)

У меня возникли проблемы с поиском наилучшего способа хранения некоторых данных в моей базе данных. Я должен хранить даты DD/MM в базе данных, но я не уверен, что это лучший способ сохранить это, чтобы его можно было легко сортировать и искать.

В принципе пользователь сможет сохранить важные даты в формате DD/MM, о чем им будет напоминать ближе к дню.

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

4b9b3361

Ответ 1

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

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

Наличие в столбце даты облегчает сортировку , целостность, проверку достоверности и т.д.

Чтобы обслуживать високосные годы, используйте год, например "0004", который позволяет "0004-02-29". Использование 4-го года делает его несколько более сложным, чем год 0, но, как пример, это превращает дату '29 -Feb '(year agnostic) в дату в этом году для сравнения с другим полем

select
    adddate(
    subdate(cast('0004-02-29' as date),
        interval 4 year),
        interval year(curdate()) year)

result: 2011-02-28

Ответ 2

Являются ли эти даты повторяющимися? Если нет, как вы будете отслеживать, когда "истек"? Если ответ будет "приложение будет вручную удалять даты по истечении срока их действия", то почему бы просто не сохранить дату DD/MM в качестве следующего доступного экземпляра этой даты? Например:

01/02 становится 2012-02-01, а 04\07 становится 2011-07-04

Встроенные функции даты/времени настолько полезны, что я настоятельно рекомендую не использовать varchars или tinyints.

Ответ 3

Если вы действительно хотите отбросить год, то просто сделайте ДВЕ столбцы, один на день и другой на месяц. Затем сохраните их отдельно.

CREATE TABLE `table-name` (
  `Day` tinyint NOT NULL,
  `Month` tinyint NOT NULL
);

Но гораздо лучше просто использовать тип Date, а затем игнорировать год в вашем коде.