SQL Check Contraint для списка правил - PullRequest
0 голосов
/ 01 декабря 2018

Я надеюсь, что кто-нибудь сможет помочь мне с этим.Я хотел бы создать ограничения проверки для разных категорий водительских прав и минимального возраста для получения права.Например,

Category  -  Age

AM   -       16

A2    -      18

A      -     24

Я думаю, мне нужно сделать ряд отдельных ограничений для этого.Я думаю, что у меня есть все части, мне просто нужна помощь, чтобы собрать все это вместе.

Здесь приведен SQL-код для проверки правильности введенной категории лицензии;

ALTER TABLE ONLY public."salespeople"

ADD CONSTRAINT CHK_Driverslicense CHECK (spDriverslicense IN ('AM', 'A1', 'A2', 'A', 'B', 'BE', 'W', 'C', 'CE', 'C1', 'C1E', 'D', 'DE', 'D1', 'D1E'));

В БД есть только столбец даты рождения, но нет столбца «лет».Я могу получить возраст;

SELECT *,  age(current_date, spdob)

FROM public."salespeople";

У меня проблемы с их объединением.

ALTER TABLE ONLY public."salespeople"

ADD CONSTRAINT CHK_AM_16YO CHECK (spDriverslicense = 'AM' AND (age(current_date, spdob) > 16));

Я получаю ошибку

ERROR: operator does not exist: interval > integer 
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

Я думаю, чтопроблема в том, что возраст = 30 лет 3 месяца 10 дней и т. д., поэтому его нельзя сравнить с целым числом.Вот где я застрял.Благодаря.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Не используйте age().Вместо этого просто используйте сравнения дат:

ALTER TABLE ONLY public."salespeople"
    ADD CONSTRAINT CHK_AM_16YO
        CHECK (spDriverslicense = 'AM' AND
               spdob >= current_date - interval '16 year'
              );
0 голосов
/ 01 декабря 2018

Функция age() возвращает INTERVAL и поэтому не может использоваться для сравнения с целым числом (например, [interval] > 16).

Однако вы можете извлечь компонент year интервала с использованием функции extract(), и его можно сравнить с целым числом:

EXTRACT(year FROM AGE(current_date, spdob)) > 16

Например, SELECT EXTRACT(year FROM interval '12 years 11 months') возвращает 12.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...