我想到了两种可能性:
NUMBER(4)
DATE
专业NUMBER(4)
:
Con NUMBER(4)
:
专业DATE
:
Con DATE
:
作为额外要求,该列与当前年份EXTRACT (YEAR FROM SYSDATE)
进行比较。在我看来NUMBER(4)
是更好的选择。您怎么看?我错过了另一种选择吗?
答案 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表(闰年等)的更多信息,并且可以在创建时验证维度中的条目。