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

Oracle中合理的年份数据类型是什么?,oracle,types,Oracle,Types,我想到了两种可能性: 编号(4) 日期 Pro编号(4): 如果指定为唯一,则不可能有重复条目 简单算术(加一,减一) Con编号(4): 无验证(例如负数) Pro日期: 验证 合同日期: 可能存在重复条目('2013-06-24'、'2013-06-23'、…) 不是那么简单的算术(加一=加上个月(12)) 作为附加要求,该列将与当前年份进行比较摘录(从SYSDATE算起的年份)。在我看来,NUMBER(4)是更好的选择。你认为呢,我还错过了其他选择吗?你已经很好地总结了

我想到了两种可能性:

  • 编号(4)
  • 日期
Pro
编号(4)

  • 如果指定为唯一,则不可能有重复条目
  • 简单算术(加一,减一)
Con
编号(4)

  • 无验证(例如负数)
Pro
日期

  • 验证
合同日期:

  • 可能存在重复条目('2013-06-24'、'2013-06-23'、…)
  • 不是那么简单的算术(加一=加上个月(12))

作为附加要求,该列将与当前年份进行比较
摘录(从SYSDATE算起的年份)
。在我看来,
NUMBER(4)
是更好的选择。你认为呢,我还错过了其他选择吗?

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


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

< P>根据您的用例,您也可以考虑建立一个一次性日期(维度)表,并通过ID链接到特定的行。这样,您就可以获得更多的信息,这些信息可以稍后添加到DIN表(闰年等)。并且维度中的条目可以在创建时进行验证。

如果愿意,可以使用基于函数的索引,将
日期
列限制为每年只有一个条目:

create unique index uq_yr on <table> (trunc(<column>, 'YYYY'));
创建唯一索引uq_yr on(trunc(,'YYYY');
尝试在同一年中插入两个日期会导致ORA-00001错误。当然,如果你不想保留日期的剩余部分,那么保留该日期可能没有帮助或令人困惑,但另一方面,你可能需要保留次要信息(例如,如果你正在记录发生的年度审计,保留完整日期可能不会造成任何伤害)。您还可以有一个虚拟列(来自11g),其中保存
trunc
值,以便于操作

您还可以使用
间隔年(4)到月
数据类型,并使用
numtoyminterval(2013,'year')
等进行插入。您可以使用间隔算术来添加和减去年,
提取
以将年作为数字返回。总的来说,这可能比使用日期更痛苦


如果你真的只对年份感兴趣(而且你没有把月份放在不同的列中!),那么一个数字可能是最简单的,带有一个检查约束以确保它是一个合理的数字-
number(4)
不会阻止你插入
2.013
,而你的意思是
2013
(虽然您需要从字符串转换以命中该值,并且没有NLS参数不匹配),但如果使用
NUMBER(4,0)
可以将其截断为
2

,编写检查约束以避免无效输入是相当容易的。顺便说一句,我不知道日历的年份为零,但它们都是负数;-)+1用于确认此选择。我打算这样做。非常感谢。