【问题标题】:Constrains using DATE使用 DATE 进行约束
【发布时间】:2016-10-11 04:29:41
【问题描述】:

我正在尝试创建一个约束来检查记录不超过 2016 年。

这是我数据库中的记录

这是我的查询:

ALTER TABLE SIGHTINGS 
   ADD CONSTRAINT CK_SIGHTING_DATE 
   CHECK (SIGHTING_DATE <=TO_DATE('01-JAN-16'));

但我收到一条错误消息:第 1 行出现错误:

ORA-02436: 在 CHECK 中错误地指定了日期或系统变量 约束。

我在这个网站上检查了一些类似的问题,但那里的解决方案不能解决我的问题。

【问题讨论】:

标签: sql oracle ddl check-constraints


【解决方案1】:

一个选项是使用extract() 函数,因为您只想检查年份:

ALTER TABLE SIGHTINGS 
   ADD CONSTRAINT CK_SIGHTING_DATE 
   CHECK (extract(year from SIGHTING_DATE) < 2016);

或使用 ANSI 日期文字:

ALTER TABLE SIGHTINGS 
   ADD CONSTRAINT CK_SIGHTING_DATE 
   CHECK (SIGHTING_DATE < date '2016-01-01');

【讨论】:

  • 我已经尝试了这两个选项,但我得到了这个错误:ORA-02293: cannot validate (S4369490.CK_SIGHTING_DATE) - check constraint denied.
  • @SeanLi:那么显然您正在插入违反该规则的行(例如 2016 年的日期)
  • 您的意思是已经有一些现有记录违反了该规则?
【解决方案2】:

你已经制定了日期规范

ALTER TABLE SIGHTINGS 
   ADD CONSTRAINT CK_SIGHTING_DATE 
   CHECK (SIGHTING_DATE <= 
               /*TO_DATE('01-JAN-16','DD-MON-YY') as I was pointed your should specify 4 digits for year*/ 
                 TO_DATE('01-JAN-2016','DD-MON-YYYY'));

 ALTER TABLE SIGHTINGS 
   ADD CONSTRAINT CK_SIGHTING_DATE 
   CHECK (SIGHTING_DATE <=DATE'2016-01-01');

另一件事是你说“不超过 2016 年”是什么意思 您的支票最低日期为 2016 年 1 月 1 日,但不允许 2016 年 1 月 2 日。 如果您想包括整个 2016 年,请写

SIGHTING_DATE < DATE'2017-01-01'

或 trunc(SIGHTING_DATE,'yy')

【讨论】:

  • '01-JAN-16','DD-MON-YY' 取决于本地 NLS_DATE_LANGUAGE,对于英语以外的其他语言可能会失败。两位数的年份16 也不是很聪明。
  • 它是如何依赖的?我写了一个字符串并指定了一种格式。从 2000 年到 2099 年的整个世纪,它将返回 2016 年 1 月 1 日。
  • 当我尝试你的第一个建议时,我得到了同样的错误:ORA-02436: date or system variable wrongly specified in CHECK constraint
猜你喜欢
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2016-10-11
  • 2021-06-22
相关资源
最近更新 更多