我希望有人能够对此提供帮助。我想为不同类别的驾驶执照和符合资格的最低年龄创建Check约束。例如
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天等,因此不能与整数进行比较。这就是我卡住的地方。谢谢。
答案 0 :(得分:0)
age()
函数返回一个INTERVAL
,因此不能与整数(例如[interval] > 16
)进行比较。
不过,您可以使用extract()
函数提取区间的 year 分量,并将其与整数进行比较:
EXTRACT(year FROM AGE(current_date, spdob)) > 16
例如,SELECT EXTRACT(year FROM interval '12 years 11 months')
返回12
。
答案 1 :(得分:0)
请勿使用age()
。相反,只需使用日期比较:
ALTER TABLE ONLY public."salespeople"
ADD CONSTRAINT CHK_AM_16YO
CHECK (spDriverslicense = 'AM' AND
spdob >= current_date - interval '16 year'
);