Как хранить дни рождения без годовой части? - PullRequest
8 голосов
/ 11 октября 2011

Аналогичный вопрос: Выбор дней рождения Postgres

Мы разрабатываем новую функцию: мы будем хранить части месяца и дня рождения людей, но не год.Таким образом, у пользователя, рожденного на Рождество, будет день рождения "12/25".Вопрос в том, как мы можем лучше всего представить это в postgres?

  1. Для столбца date требуется год, и он также отклоняет високосные дни в не-високосных годах.Мы можем хранить все дни рождения с произвольным високосным годом, например, '1972-12-25', но это будет чем-то вроде клочья.
  2. Мы могли бы использовать два столбца int, один для месяца и один для года,но мы потеряли бы полностью встроенную проверку даты в pg, и вы могли бы сохранить дату '02-31'.
  3. Мы могли бы использовать один столбец text, но запрос этого не был бы хорош.

Есть ли какие-то варианты, которые нам не хватает?В настоящее время мы склоняемся к паре целочисленных столбцов.

Редактировать:

Почему бы не просто сохранить дату рождения - которая должна быть действительной датой - и перейти оттуда?

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

Ответы [ 3 ]

7 голосов
/ 11 октября 2011

Просто сохраните дату с произвольным високосным годом и отформатируйте ее как нужно в SELECT.
У меня есть ряд случаев, когда я делаю именно это. Это намного проще, чем все другие идеи.

Обновление после редактирования вопроса

Если год рождения необязательно , тогда дата имеет дополнительное преимущество, заключающееся в том, что вы можете сохранить год, если он у вас есть - в тех же 4 байтах необходим столбец даты. Используйте произвольный високосный год, который невозможен для дат без года. Как 2400 или 1804.

3 голосов
/ 11 октября 2011

Поскольку обычные функции даты Postgres вам в действительности не помогут, лучше всего хранить месяц и день в виде целочисленных столбцов.Вы не сможете «проверить» дату больше, чем проверить, что число дней не превышает максимальное количество дней в данном месяце (если пользователь вводит 29 февраля, вы не можете с ним спорить).

Если вас беспокоит достоверность данных, вы можете использовать пару месяц / день в качестве внешнего ключа в таблице, в которой хранится 366 строк, по одной на каждую действительную пару месяц / день.1004 * Возможно, вам все равно придется обрабатывать 29 февраля, особенно если вы делаете что-то вроде отправки поздравлений пользователю с днем ​​рождения.

0 голосов
/ 11 октября 2011

Это скорее проверка на стороне клиента.

Мы привыкли предлагать пользователям список месяцев и дней.

Проверьте его перед отправкой формы.

Магазинэто в таблице в виде одного строкового столбца, который индексируется.

Каждый день, задание cron, сканирует все действительные записи, выпадающие в виде сегодняшней комбинации день / месяц, и отправляет приветствия в свой почтовый ящик в соответствии с типом случая, например(Годовщина или день рождения) и т. Д.

...