【问题标题】:What type should I use for year-only columns?我应该为仅限年份的列使用什么类型?
【发布时间】:2015-01-28 16:05:37
【问题描述】:

我正在尝试在 Oracle 中创建一个表,并希望将数据类型设为一年:

create table testingTable
(
testID varchar2(3) primary key,
dateDeveloped year(4)
);

我收到的错误消息是

Error at Command Line : 16 Column : 19
Error report -
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

感谢您的宝贵时间。

【问题讨论】:

  • 新数据类型应该有什么范围? 1900 年及以后?公元前 8000 年到公元 300,000 年?它应该拒绝第 0 年吗?

标签: sql oracle date create-table


【解决方案1】:

看起来您使用了错误的语法。应该是这样的。

INTERVAL YEAR (precision) TO MONTH 

一段时间,以年和月表示。精度值指定日期的 YEAR 字段中的位数。精度可以从 0 到 9,默认为 2 年。 Check here了解更多信息

create table testingTable
(
testID varchar2(3) primary key,
dateDeveloped INTERVAL YEAR(4) TO MONTH
);

【讨论】:

  • 他是要存储年,如经过的时间量还是实际年份?可能想要使用 DATE 而不是间隔,但我认为我们知道的不够多,无法确定。
  • 谢谢两位。我想将信息存储为某事发生的年份,而不是年数。我确实尝试过使用 DATE,但无法让它发挥作用。
  • 区间不存储年份吗? (@NoDisplayName,一个月后有一个额外的括号,我试图编辑出来,以便代码按原样运行,但如果不更改 6 个字符,我就无法编辑......)另外,任何人都可以解释为什么我们需要“当我们试图存储年份时?再次感谢!
  • 间隔是-嗯-一段时间(而不是一个时间点)。并且由于一年是一个时间点而不是一个时间点,因此对于例如 2014-01-01 00:00:00 到 2014-12-,间隔的 Oracle 读数更接近 1 年(比 2014 年) 31 时 23 分 59 分 59 秒。上面提供了存储年份(日期的一部分)的选项 - 每个选项都有自己的特点(简而言之:清晰度与易用性/持续时间与时间点)
【解决方案2】:

为了让社区对“如何仅在表格中存储年份”有意见,我发布了两个截然相反的答案。我已经为他们制作了社区 wiki,因此请随意根据您的意见投赞成票或反对票。


如果你想存储“时间点”,你应该使用DATE 类型:

create table testingTable
(
  testID varchar2(3) primary key,
  dateDeveloped date
);

如果您只对年份组件感兴趣,您可以在使用该字段时提取它:

extract(year from dateDeveloped)

在插入时,您会将 4 位年份转换为适当的日期:

to_date('1984', 'YYYY') -- evaluating to the rather surprising 11/01/1984

【讨论】:

  • 谢谢,@Sylvain。问题是我们如何输入信息。我认为我们不会有比今年更具体的事情了。对于只有一年的日期,人们是否遵循 1976-00-00 之类的约定?
  • @Grace:日期不只有一年。如果你只有一年,你就有一年。例如,1986 不是有效的出生日期。一年了。
  • 我同意@thatjeffsmith 应该是yearDeveloped;该列已经具有date 数据类型,但您想传达一个事实,即只有年份部分很重要。附言在插入时,我总是会截断到 1 月 1 日,并在表上设置一个约束以禁止其他日期。
  • @Jeffrey 关于约束的好主意。你能相应地编辑答案吗?这是一个社区 wiki,任何人都无法获得代表,但我相信这可能是一个非常好的改进。
  • 首先,year() 不是数据类型。这是一个功能。其次,我不建议使用 year 作为数据类型。我只是说一年不是一个日期。要在任何 SQL 数据库中存储一年,我会使用某种整数或数字数据类型以及 check() 约束。
【解决方案3】:

为了让社区对“如何仅在表格中存储年份”有意见,我发布了两个截然相反的答案。我已经为他们制作了社区 wiki,因此请随意根据您的意见投赞成票或反对票。


如果您只想存储 4 位数的年份,为什么还要使用 DATE 类型呢?请改用NUMBER(4)

create table testingTable
(
  testID varchar2(3) primary key,
  yearDeveloped number(4)
);

这样,您可以在使用字段时直接访问年份。

【讨论】:

  • 这是一个很好的观点。我只是倾向于尽可能具体地定义数据类型,所以如果可以将某事标记为一年,我想这样做。我将采用您的解决方案。再次感谢。
  • dateDeveloped - 我会将其重命名为“yearDeveloped” - 以后看到的任何人都会认为这是一个日期。
  • @Sylvain,我会使用你的任何一个建议,两者都可以和另一个一样好。 NUMBER 版本对于未来的开发者来说可能不会那么混乱;但是,DATE 版本对于日期运算可能更方便。总的来说,我更喜欢 NUMBER 版本。
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2015-12-15
  • 2022-01-18
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多