【问题标题】:How could I default a date column as 21 days ahead of another date column in oracle?如何在 oracle 中将日期列默认为比另一个日期列提前 21 天?
【发布时间】:2021-03-06 11:43:22
【问题描述】:

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

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

此代码返回“ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER”。 使用 '21' 会返回相同的错误。 任何帮助表示赞赏!

【问题讨论】:

  • 可能需要一个触发器。但我可能会建议在代码中这样做,或者如果总是提前 21 天,只需查看
  • 'checkout_date' 是一个字符串。通过应用+ 21,您使 Oracle 认为该字符串包含一个要添加到 21 的数字。因此出现错误“expected DATE got NUMBER”。
  • 接受的答案表明您永远不需要DEFAULT(在插入行时未指定列值时使用),而是计算列(直接或通过视图)。确保您了解未来情况的不同之处。

标签: sql oracle datetime create-table


【解决方案1】:

我认为 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 不会这样做)。

【讨论】:

  • 是的,我认为甲骨文在环顾四周后不会这样做。非常感谢这些解决方案。
  • 我认为您对“默认”的含义感到困惑。在insert 语句中,仅当没有为该列提供值时才使用默认值——该列不包含在insert 语句的列表中。如果为列提供了null,则值null,该情况不使用默认值。你不能用视图来做到这一点。在我看来,这个答案是完全错误的;对我投反对票。
  • @mathguy:我确实理解默认的概念。我在 SO 上的经验告诉我们,我们有时需要在 OP 所要求的内容之间进行解读,而不是遵循严格的解释 - 对于它的价值,事实证明 OP 接受了这个答案。我仍然进行了编辑,以便更详细地说明在所有情况下这与 DEFAULT 的行为不完全相同(我同意我的回答中缺少这条信息)。
  • 是的 - 所以我们同意:如果您假设 OP 的意思不是他所要求的,您应该在答案的顶部说明这一点。至于 OP 接受答案并证明某些事情(anything),让我们不要讨论这个...... :-)
  • 我最终创建了一个视图来代替我正在尝试做的事情,谢谢大家在这里提供一些有用的信息!
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多