Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle SQL中将月份添加到结束日期作为约束_Sql_Oracle - Fatal编程技术网

在Oracle SQL中将月份添加到结束日期作为约束

在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,

我有一个关于Oracle数据库SQL的问题

我的员工每个人都有一个项目,项目的结束日期取决于根据PTEM给他们的月数。我这样做对吗

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