Ограничение по возрасту в postgresql

#sql #postgresql

#sql #postgresql

Вопрос:

Я хочу реализовать следующее ограничение в PostgreSQL:

Люди не могут иметь дат рождения, когда на 01/01/2016 им более 100 лет.

Итак, я внедрил ограничение как:

 ALTER TABLE person ADD CONSTRAINT CHK_biggerThan100 CHECK(
  (
    (extract(year FROM current_date)  - extract(year FROM birth)) * 365   
    (extract(month FROM current_date) - extract(month FROM birth))* 30  
    (extract(day FROM current_date)   - extract(day FROM birth))
  ) < 36500 --100 years
);
  

Возможно ли реализовать это ограничение более элегантным способом? И как я могу сравнить день рождения с датой 1/1/2016?

Моя таблица person имеет только два атрибута: person_id (int) в качестве первичного ключа и birth (дата).

Комментарии:

1. Это действительно логика уровня приложения, и это также довольно субъективная вещь. Люди обычно доживают до 100 лет, к большому ужасу самоуверенных компьютерных систем, подобных этой.

Ответ №1:

Используйте функции date_part() и age()

Подробности см. в документации по функциям датыhttps://www.postgresql.org/docs/current/static/functions-datetime.html

 ALTER TABLE person ADD CONSTRAINT CHK_biggerThan100 
CHECK (date_part('year',age(timestamp '2016-01-01',birth))<100)
  

Комментарии:

1. Спасибо. Но как я могу сравнить его с 1/1/2016, чтобы узнать, превышает ли возраст до этой даты 100? [отредактированный вопрос]

2. Не могли бы вы использовать функцию age для сравнения двух дат — рождения и 1/1/2016, а затем использовать date_part, чтобы проверить, <100 лет? Я отредактировал свой ответ. Смотрите связанную документацию для описания используемых функций.

Ответ №2:

Я думаю, что это проще:

 ALTER TABLE person ADD CONSTRAINT CHK_biggerThan100
    CHECK (birthdate > '2016-01-01' - interval '101 year')
  

101 год — это потому, что утверждение «более 100», а не «100 или более».

Комментарии:

1. не совсем верно. 100 лет 1 день — это больше, чем 100 лет, но меньше, чем 101 год. В любом случае, идея использования interval хороша!

2. @BartoszBilicki . . . Это одна из интерпретаций. Однако, если возраст измеряется только в целых числах, то 100 равно 100 в течение всего года, пока человеку не станет 101.