0

这是我的桌子:

create table exemplare(
    id integer,
    id_tierart integer not null,
    name varchar2(32),
    details varchar2(32),
    geburtsdatum date,
    kaufdatum date,
    
    constraint pk_exemplare_id primary key(id),
    constraint fk_exemplare_id_tierarzt foreign key(id_tierart) references tierarten(id),
    constraint uq_exemplare_name unique(name, id_tierart),
    constraint ck_exemplare_geburtsdatum check(to_char(geburtsdatum, 'mm') < 10),
    -- constraint ck_exemplare_kaufdatum check(to_char(geburtsdatum, 'yyyy') - to_char(kaufdatum, 'yyyy') <= 100),
    constraint ck_exemplare_kaufdatum check(to_char(kaufdatum-geburtsdatum, 'yyyy') <= 100),
    constraint ck_exemplare_id check(MOD(id, 10) = 0)
);

insert into exemplare values(10, 11, 'Hugo', 'bedroht', to_date('13.05.1975', 'dd.mm.yyyy'), to_date('04.07.2018', 'dd.mm.yyyy'));
insert into exemplare values(20, 22, 'Fred', 'nicht bedroht', to_date('13.05.1975', 'dd.mm.yyyy'), to_date('04.07.2018', 'dd.mm.yyyy'));

在插页上说:

Fehler beim Start in Zeile: 66 in Befehl -
insert into exemplare values(20, 22, 'Fred', 'nicht bedroht', to_date('13.05.1975', 'dd.mm.yyyy'), to_date('04.07.2018', 'dd.mm.yyyy'))
Fehlerbericht -
ORA-01481: invalid model for number format

to_date 函数似乎存在某种问题,但我无法弄清楚究竟是什么问题有没有人知道它为什么不起作用?

4

1 回答 1

1

我认为问题在于这个约束:

constraint ck_exemplare_kaufdatum check(to_char(kaufdatum-geburtsdatum, 'yyyy') <= 100),

我们可以在 Oracle 中对日期进行算术运算,所以这kaufdatum-geburtsdatum是有效的,但结果是numeric。因此,在 TO_CHAR() 中使用日期格式掩码是无效的。

您发布的代码显示了应该有效的约束的注释版本。为什么不使用它呢?

constraint ck_exemplare_kaufdatum check(to_char(geburtsdatum, 'yyyy') - to_char(kaufdatum, 'yyyy') <= 100)
于 2020-11-24T18:16:32.893 回答