为什么oracle sql不允许在计数年龄的表创建时间中使用sysdate?

为什么oracle sql不允许在计数年龄的表创建时间中使用sysdate?,oracle,Oracle,询问。。。。 我想尝试对生日和检查年龄进行检查限制,检查年龄应大于18岁 Create table emp ( Birthdate date, Check( MONTHS_BETWEEN(SYSDATE,Birthdate)) ); 上面的查询出错…为什么? 谁能帮帮我 为什么oracle sql不允许在计数年龄的表创建时间中使用sysdate?这是因为oracle的限制。原因是SYSDATE是不确定的。每次调用时,都会得到不同的结果。所以结果(真/假)会随着时间而改变。所以Oracle不能保

询问。。。。 我想尝试对生日和检查年龄进行检查限制,检查年龄应大于18岁

Create table emp
(
Birthdate date,
Check( MONTHS_BETWEEN(SYSDATE,Birthdate))
);
上面的查询出错…为什么? 谁能帮帮我


为什么oracle sql不允许在计数年龄的表创建时间中使用sysdate?

这是因为oracle的限制。原因是SYSDATE是不确定的。每次调用时,都会得到不同的结果。所以结果(真/假)会随着时间而改变。所以Oracle不能保证表达式对每一行都是真的


另请参见

这是因为Oracle的限制。原因是SYSDATE是不确定的。每次调用时,都会得到不同的结果。所以结果(真/假)会随着时间而改变。所以Oracle不能保证表达式对每一行都是真的


另请参见

SYSDATE是不允许的,因为在查看数据时,约束必须是“true”或“false”。如果能够在检查约束中使用SYSDATE,则可以插入当时满足该约束的行,但稍后会违反该约束。不好

在您的示例中,一旦在插入时满足约束,它就不能在以后变为“不满足”。但在这里,你要求甲骨文思考。不可能。它只是不允许您在约束中使用SYSDATE。句号

相反,您应该编写一个简单的触发器来执行检查。请注意,在所谓的检查约束中,您缺少与18*12的比较;在某些情况下,两个月之间可能会产生一些奇怪的结果;编写反映您想法的代码总是最好的:在这种情况下,条件(在触发器中,而不是检查约束中)应该是***

sysdate >= birthdate + interval '18' year
***编辑:正如亚历克斯·普尔(Alex Poole)在下面指出的那样,为日期添加时间间隔有时可能会像两个月之间那样奇怪。写支票的安全方法是

sysdate >= add_months ( birthdate, 18 * 12 )   --  age >= 18 years or 18 * 12 months

(这就是我写它的方式-带有解释目的的注释,以及18*12。)

SYSDATE是不允许的,因为在查看数据的任何时候,约束必须是“true”或“false”。如果能够在检查约束中使用SYSDATE,则可以插入当时满足该约束的行,但稍后会违反该约束。不好

在您的示例中,一旦在插入时满足约束,它就不能在以后变为“不满足”。但在这里,你要求甲骨文思考。不可能。它只是不允许您在约束中使用SYSDATE。句号

相反,您应该编写一个简单的触发器来执行检查。请注意,在所谓的检查约束中,您缺少与18*12的比较;在某些情况下,两个月之间可能会产生一些奇怪的结果;编写反映您想法的代码总是最好的:在这种情况下,条件(在触发器中,而不是检查约束中)应该是***

sysdate >= birthdate + interval '18' year
***编辑:正如亚历克斯·普尔(Alex Poole)在下面指出的那样,为日期添加时间间隔有时可能会像两个月之间那样奇怪。写支票的安全方法是

sysdate >= add_months ( birthdate, 18 * 12 )   --  age >= 18 years or 18 * 12 months
(这就是我写这篇文章的方式——加上解释目的的注释,以及18*12。)

也许可以试试:

SQL> create table person
(name varchar2(100),
dob date,
created_date date default sysdate not null,
constraint dob_check check
     (
        dob <= add_months(trunc(created_date), (12*18)*-1)
     )
)
Table created.
SQL> insert into person(name,dob) values ('Bob', to_date('19740101','YYYYMMDD'))
1 row created.
SQL> commit
Commit complete.
SQL> insert into person(name,dob) values ('Jane', to_date('20050101','YYYYMMDD'))
insert into person(name,dob) values ('Jane', to_date('20050101','YYYYMMDD'))
Error at line 17
ORA-02290: check constraint (MYUSER.DOB_CHECK) violated
SQL>createtableperson
(名称varchar2(100),
dob日期,
创建日期默认系统日期不为空,
约束dob_检查
(
dob插入个人(姓名,dob)值('Bob',截止日期('19740101','YYYYMMDD'))
创建了1行。
SQL>提交
提交完成。
SQL>插入个人(姓名、dob)值('Jane',截止日期('20050101','YYYYMMDD'))
在person(name,dob)值中插入('Jane',to_date('20050101','yyyyymmdd'))
第17行出错
ORA-02290:违反检查约束(MYUSER.DOB_check)
也许可以尝试:

SQL> create table person
(name varchar2(100),
dob date,
created_date date default sysdate not null,
constraint dob_check check
     (
        dob <= add_months(trunc(created_date), (12*18)*-1)
     )
)
Table created.
SQL> insert into person(name,dob) values ('Bob', to_date('19740101','YYYYMMDD'))
1 row created.
SQL> commit
Commit complete.
SQL> insert into person(name,dob) values ('Jane', to_date('20050101','YYYYMMDD'))
insert into person(name,dob) values ('Jane', to_date('20050101','YYYYMMDD'))
Error at line 17
ORA-02290: check constraint (MYUSER.DOB_CHECK) violated
SQL>createtableperson
(名称varchar2(100),
dob日期,
创建日期默认系统日期不为空,
约束dob_检查
(
dob插入个人(姓名,dob)值('Bob',截止日期('19740101','YYYYMMDD'))
创建了1行。
SQL>提交
提交完成。
SQL>插入个人(姓名、dob)值('Jane',截止日期('20050101','YYYYMMDD'))
在person(name,dob)值中插入('Jane',to_date('20050101','yyyyymmdd'))
第17行出错
ORA-02290:违反检查约束(MYUSER.DOB_check)

表示不能调用非确定性函数。表示不能调用非确定性函数。我不会将其称为“Oracle限制”。Oracle限制是缺少布尔数据类型。SYSDATE限制是逻辑限制,与Oracle受到某种限制无关。(正如您所做的,事实上,请在您的回答中解释!)我不会称之为“Oracle限制”。Oracle限制是缺少布尔数据类型。对SYSDATE的限制是一种逻辑限制,与Oracle受到某种限制无关。(事实上,请在您的回答中解释!)在某些情况下,向日期添加间隔将失败;在这种情况下,对于2月29日的生日(例如,
date'2000-02-29+interval'18'year
将使用
add_months()获得“ORA-01839:日期对指定月份无效”。)
和18*12在这里更安全。@AlexPoole-呃,我知道大约在两个月之间;我从来没有想过要检查它的间隔。谢谢你指出!在某些情况下,在日期中添加间隔会失败;在这种情况下,在2月29日的出生日期(例如,
日期'2000-02-29+间隔'18'年
会失败“ORA-01839:指定月份的日期无效”。)使用
add_months()和18×12在这里更安全。@ AlxPoel-UGH,我知道大约两个月之间;我从来没有想过要检查它的间隔。谢谢你指出它。@ GutaMisty -请在帮助中心看到。如果这是你使用的方法然后考虑。@ GutaMisty -请在帮助中心看到。如果这是你使用的方法,然后CON。赛德。