SQL:在日期列中仅添加年份值

时间:2017-11-17 19:22:11

标签: sql oracle

我想要一张有雇员姓名和出生年份的表格。只有年份格式:

CREATE TABLE EMPLOYEE(
  Name VARCHAR2(50) NOT NULL,
  Year_Birth DATE NOT NULL,
  PRIMARY KEY (Name)
);

我想这样做:

INSERT INTO EMPLOYEE(Name, Year_Birth)
VALUES ('John Smith', 1985);

但它不起作用(因为我将数字值传递给日期列)。我也试过这个:

INSERT INTO EMPLOYEE(Name, Year_Birth)
VALUES ('John Smith', to_date('1972','YYYY') )

如果我尝试这个,我会得到这个: ORA-02290:违反检查约束(PROJECTNAME.SYS_C0066777818)

Year_Birth必须是日期列。有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:2)

我认为出生年应该是INT,就像这样:

CREATE TABLE EMPLOYEE(
  Name VARCHAR(50) NOT NULL,
  Year_Birth INT NOT NULL,
  PRIMARY KEY (Name)
);

然后这应该有效:

INSERT INTO EMPLOYEE(Name, Year_Birth)
VALUES ('John Smith', 1985);

答案 1 :(得分:1)

您可以创建数据类型为 int 的列。这样就可以节省出生年份。

如果列必须是数据类型日期,那么您可以将日期保存为相关年份的1月1日(例如,2017年输入' 20170101' )。这仍然允许您对数据执行日期计算。

答案 2 :(得分:1)

您可以创建一个数据类型为int的列。 insert语句将起作用。

insert into employee(Name, Year_Birth)
values ('John Smith', 1985);

答案 3 :(得分:0)

我假设您的神秘检查约束SYS_C0066777818正在执行year_birth必须是1月1日的规则。

to_date('1972','YYYY')并没有像你预期的那样给出1972年1月1日,它在1972年给出当月的第一个月。谁知道为什么,但这就是它的工作方式。如果你想要1972年1月1日那么你必须明确指定它,例如:

insert into employee (name, year_birth)
values ('John Smith', date '1972-01-01');

或等效to_date表达式,至少包含月份或trunc(somedatevariable,'YEAR')