对SYSDATE减去出生日期的约束

时间:2016-09-27 01:21:01

标签: sql oracle

我很想知道我做错了什么,

我想在oracle中添加一个CHECK约束,以确保用户超过18

所以我做了

ALTER TABLE User
ADD CONSTRAINT  check_age CHECK(TO_CHAR(SYSDATE, 'yyyy/mm/dd')- TO_CHAR(dateOfBirth, 'yyyy/mm/dd')> 18)

但我收到错误

  

原因:尝试使用日期常量或系统变量,              例如USER,在一个不完全的检查约束中              在CREATE TABLE或ALTER TABLE语句中指定。对于              例如,指定的日期没有世纪。   *操作:完全指定日期常量或系统变量。              设置事件10149允许约束,例如“a1> '10 -MAY-96'”,              允许在版本8之前创建的错误。

为什么这是错的?

我仍然不明白为什么我不能添加它,如果有人可以向我解释,我会很乐意

谢谢

1 个答案:

答案 0 :(得分:1)

从Oracle 11g开始,虽然您无法在约束中直接使用sysdate,但您可以使用虚拟列获得相同的效果:

create function over_18 ( 
    p_birth_date in User.dateOfBirth%type
) return varchar2 deterministic is

begin
    return case when months_between(sysdate, p_birth_date) /12 > 18 then 'Y' else 'N' end;
end over_18;
/

alter table User add (over_18_ind as (cast(over_18(dateOfBirth) as varchar2(1))));
/

alter table User add constraint check_age check (over_18_ind = 'Y');
/

基于文章here。 即使Oracle允许您在约束中使用sysdate,您的约束也无论如何都会起作用,因为您将日期转换为的格式无法隐式转换回数字以减去(我提供的)替代年龄检查)。