我如何将日期列默认为比 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
不会这样做)。
这是我的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
不会这样做)。