在Oracle SQL中将月份添加到结束日期作为约束
我有一个关于Oracle数据库SQL的问题 我的员工每个人都有一个项目,项目的结束日期取决于根据PTEM给他们的月数。我这样做对吗在Oracle SQL中将月份添加到结束日期作为约束,sql,oracle,Sql,Oracle,我有一个关于Oracle数据库SQL的问题 我的员工每个人都有一个项目,项目的结束日期取决于根据PTEM给他们的月数。我这样做对吗 CREATE TABLE PROJECT ( P_ID VARCHAR ( 20 ) NOT NULL, PNAME VARCHAR ( 100 ) NOT NULL, PTERM VARCHAR ( 20 ), PSTARTDATE DATE,
CREATE TABLE PROJECT ( P_ID VARCHAR ( 20 ) NOT NULL,
PNAME VARCHAR ( 100 ) NOT NULL,
PTERM VARCHAR ( 20 ),
PSTARTDATE DATE,
PENDDATE DATE,
CONSTRAINT PROJECT_PKEY PRIMARY KEY ( P_ID ),
CONSTRAINT PROJECT_PTERM CHECK
( PTERM IN ('1 MONTH', '2 MONTH', '3 MONTH') ),
CONSTRAINT PROJECT_ENDDATE CHECK
( PENDDATE = (PSTARTDATE + PTERM) ) );
好的,我刚才看到你提到甲骨文,所以我想试试这个
CREATE TABLE PROJECT (
P_ID VARCHAR(20) not null,
PName VARCHAR(100) not null,
PTerm VARCHAR(20),
PStartDate DATE,
PEndDate DATE,
constraint project_Pkey primary key (P_ID),
constraint project_pterm CHECK ( PTERM IN
('1 MONTH', '2 MONTH', '3 MONTH')),
constraint project_enddate CHECK(PEndDate = (add_months(PStartDate, to_number(substr(pTerm, 1, 1)))))
);
我相信如果你有一个字段,它在number10中表示月数,而不是varchar,那么你可以使用这个字段,而不是在varchar字段中进行所有的substr和to_数字转换
CREATE TABLE PROJECT ( P_ID VARCHAR ( 20 ) NOT NULL,
PNAME VARCHAR ( 100 ) NOT NULL,
PTERM VARCHAR ( 20 ),
PSTARTDATE DATE,
PENDDATE DATE,
CONSTRAINT PROJECT_PKEY PRIMARY KEY ( P_ID ),
CONSTRAINT PROJECT_PTERM CHECK
( PTERM IN ('1', '2', '3') ),
CONSTRAINT PROJECT_ENDDATE CHECK
( PENDDATE = ADD_MONTHS(PSTARTDATE , PTERM) ) );
如果我尝试下面的插入,它们将失败,因为它严格地将开始日期加上几个月,并期望与结束日期相同
INSERT INTO
PROJECT
VALUES
( 1,
'asb',
2,
SYSDATE,
SYSDATE
+ 60 );
--ORA-02290: check constraint (PROJECT_ENDDATE) violated
INSERT INTO
PROJECT
VALUES
( 1,
'asb',
2,
SYSDATE,
SYSDATE
+ 62 );
--ORA-02290: check constraint (PROJECT_ENDDATE) violated
INSERT INTO
PROJECT
VALUES
( 1,
'asb',
2,
SYSDATE,
SYSDATE
+ 61 );
-- 1 row inserted
SQL的风格是什么?这是为哪个具体的数据库产品设计的?事情往往很快就与供应商有关。。。。这是MySQL的吗?博士后?SQL Server?神谕IBM Db2?完全是别的吗?请相应地更新您的标签!您可能会考虑从表中删除PANDATE列,而需要根据需要计算,例如,使用VIEW .HMM,我可以知道为什么pter,1,1?i保留了您所声明的约束。如果值是“1个月”、“2个月”等,那么我们需要整数部分。这就是为什么我说你应该更喜欢有一个字段,将月份作为一个数字。在这种情况下,约束将是constraint project_enddate CHECKPEndDate=add_monthpsstartdate,pTermhmm,用caps编写所有脚本是一种好的做法吗?我为我的所有项目制定了自己的规则:但如果您有任何具有自己规则定义的格式化工具,您可以只粘贴代码段并进行格式化。我用我的设置在toad中执行Ctrl+Shift+F