我如何将日期列默认为比 oracle 中的另一个日期列早 21 天?

How could I default a date column as 21 days ahead of another date column in oracle?

这是我的table(为简单起见,删除了包括主键在内的工作列)

 CREATE TABLE loans
    (checkout_date DATE,
     due_date DATE DEFAULT 'checkout_date' + 21,
     )

此代码 returns“ORA-00932:数据类型不一致:预期 DATE 得到 NUMBER”。 用'21'代替returns同样的错误。 感谢您的帮助!

我认为 Oracle 不支持从另一列设置默认值。一种解决方法是使用触发器,但这在这里可能有点矫枉过正。为什么不将逻辑放在视图中?

create view v_loans as 
select checkout_date, coalesce(due_date, checkout_date + 21) as due_date from loans

或者我们可以对计算列进行一些花哨的操作:

create table loans (
    checkout_date date,
    due_date      date,
    real_due_date date as (coalesce(due_date, checkout_date + 21))
);

那么您将在查询中使用列 real_due_date 而不是 due_date

为了使整个事情更有意义,您可能需要对列 checkout_date 进行 not null 约束。

旁注:正如 mathghy 和 Thorsten Kettner 所评论的,这并没有严格实现 DEFAULT 的概念,因为,即使 NULL 值被明确分配给列,视图(和计算列)仍将应用替换逻辑(DEFAULT 不会这样做)。