Sql 在最后一列中插入日期差异

Sql 在最后一列中插入日期差异,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我想在第6列中插入第4列和第5列的日期差,但这给了我一个错误,说第4列不允许 insert into leave25 vALUES (4, 4, 'SICK', TO_DATE('22-AUG-14','DD-MON-YY'), TO_DATE('22-SEP-14','DD-MON-YY'), startdate-enddate)\\ 您不能这样做,您需要使用您想要插入的值: INSERT INTO leave25 VALUES ( 4,

我想在第6列中插入第4列和第5列的日期差,但这给了我一个错误,说第4列不允许

insert into leave25 vALUES (4, 4, 'SICK', TO_DATE('22-AUG-14','DD-MON-YY'),  TO_DATE('22-SEP-14','DD-MON-YY'), startdate-enddate)\\

您不能这样做,您需要使用您想要插入的值:

INSERT INTO leave25
     VALUES (
             4,
             4,
             'SICK',
             TO_DATE('22-AUG-14', 'DD-MON-YY'),
             TO_DATE('22-SEP-14', 'DD-MON-YY'),
             TO_DATE('22-SEP-14', 'DD-MON-YY') - TO_DATE('22-AUG-14', 'DD-MON-YY')
此外,如果此列始终包含该差异,您确定需要存储此冗余信息吗


另一种方法是使用触发器填充该列,而不显式地给它一个值,但这取决于您的环境和需要。

您不能这样做,您需要使用您想要插入的值:

INSERT INTO leave25
     VALUES (
             4,
             4,
             'SICK',
             TO_DATE('22-AUG-14', 'DD-MON-YY'),
             TO_DATE('22-SEP-14', 'DD-MON-YY'),
             TO_DATE('22-SEP-14', 'DD-MON-YY') - TO_DATE('22-AUG-14', 'DD-MON-YY')
此外,如果此列始终包含该差异,您确定需要存储此冗余信息吗


另一种方法是使用触发器填充该列,而不显式地给它一个值,但这取决于您的环境和需要。

始终在
INSERT
语句中显式指定列名。那样比较安全

如果希望避免再次写入日期,可以从子查询中选择值

INSERT INTO leave25 
            (col1, 
             col2, 
             col3, 
             startdate, 
             enddate,
             days) 
SELECT t.*, 
       startdate - enddate 
FROM   (SELECT 4, 
               4, 
               'SICK', 
               to_date('22-AUG-14', 'DD-MON-YY') as startdate, 
               to_date('22-SEP-14', 'DD-MON-YY') as enddate
        FROM   dual) t; 

此外,我同意Aleksej的观点,最好将此差异存储为而不是列本身。

始终在
INSERT
语句中明确指定列名。那样比较安全

如果希望避免再次写入日期,可以从子查询中选择值

INSERT INTO leave25 
            (col1, 
             col2, 
             col3, 
             startdate, 
             enddate,
             days) 
SELECT t.*, 
       startdate - enddate 
FROM   (SELECT 4, 
               4, 
               'SICK', 
               to_date('22-AUG-14', 'DD-MON-YY') as startdate, 
               to_date('22-SEP-14', 'DD-MON-YY') as enddate
        FROM   dual) t; 
此外,我同意Aleksej的观点,最好将此差异存储为而不是列本身。

使用虚拟列:

CREATE TABLE Leave25(
  EMPLOYEEID INTEGER
             CONSTRAINT LEAVE25__EMPID__FK REFERENCES Employee24,
  LEAVEID    INTEGER
             CONSTRAINT LEAVE25__LEAVEID__PK PRIMARY KEY,
  LEAVETYPE  VARCHAR2(20)
             CONSTRAINT LEAVE25__LEAVETYPE__NN NOT NULL
             CONSTRAINT LEAVE25__LEAVETYPE__CHK CHECK (
               LEAVETYPE IN 'EARNED', 'SICK'
             ),
  STARTDATE  DATE
             CONSTRAINT LEAVE25__STARTDATE__NN NOT NULL,
  ENDDATE    DATE
             CONSTRAINT LEAVE25__ENDDATE__NN NOT NULL,
  DURATION   NUMBER
             GENERATED ALWAYS AS ( ENDDATE - STARTDATE ) VIRTUAL
);
并创建一个序列来管理主键:

CREATE SEQUENCE LEAVE25__LEAVEID__SEQ;
然后你可以做:

INSERT INTO leave25 (
  EMPLOYEEID, LEAVEID, LEAVETYPE, STARTDATE, ENDDATE
) VALUES (
  4, LEAVE25__LEAVEID__SEQ.NEXTVAL, 'SICK', DATE '2014-08-22', DATE '2014-09-22'
)
使用虚拟列:

CREATE TABLE Leave25(
  EMPLOYEEID INTEGER
             CONSTRAINT LEAVE25__EMPID__FK REFERENCES Employee24,
  LEAVEID    INTEGER
             CONSTRAINT LEAVE25__LEAVEID__PK PRIMARY KEY,
  LEAVETYPE  VARCHAR2(20)
             CONSTRAINT LEAVE25__LEAVETYPE__NN NOT NULL
             CONSTRAINT LEAVE25__LEAVETYPE__CHK CHECK (
               LEAVETYPE IN 'EARNED', 'SICK'
             ),
  STARTDATE  DATE
             CONSTRAINT LEAVE25__STARTDATE__NN NOT NULL,
  ENDDATE    DATE
             CONSTRAINT LEAVE25__ENDDATE__NN NOT NULL,
  DURATION   NUMBER
             GENERATED ALWAYS AS ( ENDDATE - STARTDATE ) VIRTUAL
);
并创建一个序列来管理主键:

CREATE SEQUENCE LEAVE25__LEAVEID__SEQ;
然后你可以做:

INSERT INTO leave25 (
  EMPLOYEEID, LEAVEID, LEAVETYPE, STARTDATE, ENDDATE
) VALUES (
  4, LEAVE25__LEAVEID__SEQ.NEXTVAL, 'SICK', DATE '2014-08-22', DATE '2014-09-22'
)
请检查我的答案,如果它对您有帮助,请接受,或者为给定的解决方案提供相关反馈(评论)。请阅读:了解它的重要性。请检查我的答案,如果它对您有帮助,请接受它,或者为给定的解决方案提供相关反馈(评论)。请阅读:了解为什么它很重要。