Oracle中合理的年份数据类型是什么?

时间:2013-06-24 14:45:02

标签: oracle types

我想到了两种可能性:

  • NUMBER(4)
  • DATE

专业NUMBER(4)

  • 如果指定为UNIQUE
  • ,则无法重复输入
  • 简单算术(加1,减1)

Con NUMBER(4)

  • 无验证(例如负数)

专业DATE

  • 验证

Con DATE

  • 可以重复输入('2013-06-24','2013-06-23',...)
  • 不太容易算术(加1 = ADD_MONTHS(12))

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

3 个答案:

答案 0 :(得分:3)

你已经很好地总结了利弊。

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

答案 1 :(得分: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)时,{1}}并不会阻止你插入2.013(虽然你需要从一个字符串转换为命中,并且没有NLS参数不匹配),这将被截断只是2,013

答案 2 :(得分:1)

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