3

我想到了两种可能性:

  • NUMBER(4)
  • DATE

NUMBER(4)

  • 如果指定为 UNIQUE,则不可能有重复条目
  • 简单的算术(加一,减一)

缺点NUMBER(4)

  • 无验证(例如负数)

DATE

  • 验证

缺点DATE

  • 可能出现重复条目​​('2013-06-24'、'2013-06-23'、...)
  • 不是那么简单的算术(加一 = ADD_MONTHS(12))

作为附加要求,该列与当前年份进行比较EXTRACT (YEAR FROM SYSDATE)。在我看来NUMBER(4)是更好的选择。你怎么看,我错过了另一个选择吗?

4

3 回答 3

3

你已经很好地总结了优点/缺点。

如果您清楚地命名您的字段以便易于理解它包含年份信息,那么NUMBER(4)为了简单起见,我会选择一个并且存储的内容不多于或少于必要的内容。即使没有验证,IMO 负年份也是有效的 :)

于 2013-06-24T14:53:05.997 回答
3

如果需要,您可以使用基于函数的索引将列限制为date每年只有一个条目:

create unique index uq_yr on <table> (trunc(<column>, 'YYYY'));

尝试在同一年插入两个日期会给您一个 ORA-00001 错误。当然,如果您不想要剩余的日期,那么保留它可能没有帮助或令人困惑,但另一方面,您可能想要保留次要信息(例如,如果您正在记录年度审计发生了,保持完整的日期可能不会伤害任何东西)。您还可以有一个虚拟列(来自 11g),它保存trunc值以便于操作,也许。

您还可以使用interval year(4) to month数据类型,并使用numtoyminterval(2013, 'year')等插入。您可以进行区间算术来加减年份,并将extract年份作为数字返回。date总体而言,这可能比使用虽然更痛苦。

如果您真的只对年份感兴趣(并且您没有将月份保存在不同的列中!)那么一个数字可能会是最简单的,带有检查约束以确保它是一个合理的数字 -number(4)不会停止您2.013在您的意思时插入2,013(尽管您需要从一个字符串转换为命中该字符串,并且没有 NLS 参数不匹配),这将被截断为2.

于 2013-06-24T15:31:39.083 回答
1

根据您的用例,您还可以考虑构建一次性日期(维度)表并通过 ID 链接到特定行。这样,您可以访问更多信息,您可以稍后将这些信息添加到 dinemsion 表(闰年等),并且可以在创建时验证维度中的条目。

于 2013-06-24T14:56:11.310 回答