#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.